Аргерих Л. О языке РНР. Часть 5. Страница 49


Хотя приведенный метод обходится без массива $st rings, это не значит, что другие методы не могут его использовать. Тогда класс должен обладать кон­структором, который заполняет строки, как это делает класс для вывода датского языка.

С польским объектом мы работаем точно так же, как с английским и дат­ским объектами:

Sobj = new Polish_0utput(); echo(Sobj->outNumFiles(7)); // 7 plikyw.

Имейте в виду, что весь приведенный код можно загрузить с веб-сайта Wrox http://www.wrox.com/.%d0%9f%d0%be%d0%bb%d0%bd%d1%8b%d0%b9"> http://www.wrox.com/.Полный пример, использующий все три объекта, хранится как оbjес12. php, а все классы хранятся в файле className. php.

Интеграция класса вывода и сценария

Выяснив, насколько просто переключаться между разными языками путем создания нескольких объектов, посмотрим, как обращаться с этими объек­тами в реальном сценарии.

Прежде всего, надо избавиться от создания объекта для конкретного языка. Приложение должно иметь возможность переключаться между языками на этапе исполнения, поэтому язык не должен жестко кодироваться в сценарии.

Объект для вывода должен быть сделан членом родительского В на­

шем примере родительский объект следит за количеством посещений каж­дым пользователем. Назовем объект для вывода output:

<?pbp

class App {

var $output;

function App(Slanguage) {

$this->setLanguage($language);

}

function setLanguage($new_language) {

; ;switch ($new_language)Sje case "da':

$this->output = new Danish_Output();

break;

case 'pi' ;

$this->putput = new Polish_Output();

break;

default:

$this->output = new English_Output();

break;

)

}

}

?>

В этом классе есть метод, с помощью которого происходит пе­

реход на другой язык. Данный метод принимает в качестве аргумента код страны и пытается найти его в списке языков. Найдя язык, он создает член- объект.

Затем создаем новый объект:

$obj = new Арр( 'аа ');

$obj->output->outNumFiles(2);

Обратите внимание на две стрелки ->. Это необходимо, чтобы получить до­ступ к методу outNumFiles() объекта вывода. Первая стрелка обеспечивает до­ступ к члену-объекту с именем output, а вторая - к нужному нам методу. Из­меним язык:

$obj->setLanguage('en");

Теперь наша функция setLanguage() присваивает $obj->output новый объект вывода и выбрасывает прежний объект, поскольку он больше не нужен. За­чем использовать вложенные объекты? Приведенный пример очень неве­лик. В реальном приложении объект Арр может быть гораздо больше и слож­нее. Приложение может выбирать данные из базы, выполнять над ними рас­четы и представлять результат пользователю. В такой ситуации выбрасы­вать объект Арр неэффективно, поскольку в нем содержатся результаты. Чтобы переключить язык, пришлось бы заново делать выборку данных и выполнять вычисления.