Переход к PHP5
Страница 12. Использование объектов без ссылок на них


Использование объектов без ссылок на них

Очень серьезным неудобством в PHP4 было вызывание цепочки методов. В PHP4 невозможно создать объект без ссылки на него, поскольку объекты фактически являлись только синтаксичекой конструкцией и на уровне ядра были эквивалентны массивам. Это порождало, например, такие конструкции:

$page = &$this->getPage();
$page->registerControl($this);

Конечно, это не очень удобно. Созданная на уровне ядра PHP5, таблица ссылок на объекты делает необязательным существование ссылок на объект. Благодаря этому становится возможной следующая конструкция:

$this->getPage()->registerControl($this);

Но нужно заметить, что хотя такой подход и более краток по написанию, неразумное его использование чревато очень нерациональным кодом. Например, крайне не рекомендуется делать таким образом:

for($i = 0; $i < 100; $i++)
$myObject->getProperty('relatedObject')->getAncestor($i)->update();

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

$relatedObject = $myObject->getProperty('relatedObject');
for(
$i = 0; $i < 100; $i++)
$relatedObject->getAncestor($i)->update();

Несмотря на очевидность такого подхода, довольно часто написанный код может быть улучшен с его помощью.

В следующих версиях PHP, скорее всего, можно ожидать расширения подобного подхода и к обычным массивам. Если они, конечно, еще останутся - объекты имеют тенденцию захватывать все больше и больше функциональности :-). Тогда, возможно, будет доступна следующая конструкция: print ((new ServerEnvironment()).getServerVariables())['REQUEST_URI'].

Инициализация переменных класса вне конструктора

Начальное значение переменной класса теперь можно указать непосредственно при её объявлении. Однако, её значение может быть только примитивного типа, т.е. строкой или числом. Тем не менее, этот метод является единственно возможным для задания значения статической переменной класса. Например:

class MathUtils {
static private
pi = 3.1415926;
...
}

По другому pi определить невозможно, поскольку для статических переменных не существует "статического" конструктора.

 
« Предыдущая статья   Следующая статья »