 | | Внимание! |
|---|
В PHP 3 и PHP 4 конструкторы ведут себя по-разному. Предпочтительна исключительно
семантика PHP 4. |
Конструкторы это функции класса, которые
автоматически вызываются при создании нового экземпляра класса операцией new.
В PHP 3 функция становится конструктором, когда она имеет то же имя, что и класс.
В PHP 4 функция становится конструктором, когда она имеет то же имя, что и класс,
в котором она определена - разница незаметна, но существенна (см. далее). //
Работа с PHP 3 и PHP 4. class Auto_Cart extends Cart { function Auto_Cart() {
$this->add_item ("10", 1); } } |
Здесь определяется
класс Auto_Cart, который является Cart плюс конструктор, который инициализирующий
cart одним элементом номер "10" всякий раз, когда новый Auto_Cart создаётся с
помощью "new". Конструкторы могут принимать аргументы, и эти аргументы не
обязательны, что делает эти конструкторы более используемыми. Чтобы иметь возможность
использовать класс без параметров, все параметры конструкторов нужно сделать необязательными/optional,
предоставив значения по умолчанию.
// Работа в PHP 3 и в PHP 4. class Constructor_Cart extends Cart { function
Constructor_Cart($item = "10", $num = 1) { $this->add_item ($item, $num);
} } // Использовать ту же заглушку. $default_cart = new Constructor_Cart; // Создать
новый ... $different_cart = new Constructor_Cart("20", 17); |
Вы
можете также использовать операцию @ для подавления ошибок, возникающих
в конструкторе, например, @new. | Внимание! |
|---|
|
В PHP 3 получаемые классы и конструкторы имеют некоторые ограничения. Следующие
примеры нужно внимательно разобрать, чтобы понять эти ограничения. |
class A { function A() { echo "I am the constructor of A.<br>\n";
} } class B extends A { function C() { echo "I am a regular <br>\n"; }
} // в PHP 3 конструктор не вызывается. $b = new B; |
В
PHP 3 никакой конструктор в вышеприведённом примере не вызывается. Правило PHP
3 таково: 'Конструктор это функция с тем же именем, что и класс'. Имя класса -
B, а функции с именем B() в классе B нет. Ничего не происходит. Это исправлено
в PHP 4 путём введения нового правила: если класс не имеет конструктора, вызывается
конструктор базового класса, если он имеется. В РНР 4 предыдущий пример выведет
'I am the constructor of A.<br>'. class
A { function A() { echo "I am the constructor of A.<br>\n"; } function
B() { echo "I am a regular function named B in class A.<br>\n"; echo "I
am not a constructor in A.<br>\n"; } } class B extends A { function C()
{ echo "I am a regular <br>\n"; } } // Это вызов B() как конструктора.
$b = new B; |
В PHP 3 функция B() в классе A станет конструктором
в классе B, хотя это никак не предполагается. Правило PHP 3: 'Конструктор это
функция с тем же именем, что и класс'. PHP 3 не заботиться о том, определяется
ли функция в классе B или наследуется. Это изменено в PHP 4 путём модификации
правила: 'Конструктор это функция с тем же именем, что и класс, в котором она
определяется'. Таким образом, в PHP 4 класс B может не иметь собственной функции-конструктора,
и будет вызван конструктор базового класса, печатая 'I am the constructor of A.<br>'. | Внимание! |
|---|
|
Ни PHP 3, ни PHP 4 не вызывают конструктор базового класса автоматически из
конструктора получаемого класса. Вы сами должны поместить вызовы конструкторов
в нужных местах. |
Примечание: в PHP
3 и PHP 4 нет деструкторов. Вы можете использовать register_shutdown_function()
для симуляции большей части работы деструкторов.
Деструкторы
это функции, вызываемые автоматически при уничтожении объекта в процессе работы
функции unset() или просто при выходе за пределы
области видимости. В PHP нет деструкторов. |  |