В 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>
";
}
}
class B extends A
{
function C()
{
echo "I am a regular <br>
";
}
}
// в 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>
";
}
function B()
{
echo "I am a regular function named B in class A.<br>
";
echo "I am not a constructor in A.<br>
";
}
}
class B extends A
{
function C()
{
echo "I am a regular <br>
";
}
}
// Это вызов 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 нет деструкторов.