Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Введение в СУБД HyTech.doc
Скачиваний:
11
Добавлен:
01.03.2025
Размер:
2.67 Mб
Скачать

6.4.3 Конструкторы и деструкторы Создание конструктора и деструктора

В теле класса можно определить метод конструктор и метод деструктор. Допускается определение только одного конструктора и деструктора. Имя метода конструктора __constructor, а метода деструктора __destructor.

Конструктор вызывается в момент создания объекта (оператор new). После имени класса в скобках могут быть указаны параметры, которые передаются конструктору. Конструктору будет передано столько параметров, сколько указано в скобках (т.е. конструктор будет вызван в любом случае, даже при несовпадении сигнатуры вызова – это принципиальное отличие, например, от C++).

Деструктор вызывается перед уничтожением объекта, например, при вызове unset или при работе сборщика мусора. У деструктора нет параметров.

Примеры:

<?php class Fio_Class {   public $first_name;   public $second_name;   public $family;   public $init;   // конструктор   function __construct( $par1="", $par2="", $par3="" )   {     $this->first_name = $par1;     $this->second_name = $par2;     $this->family = $par3;     $this->init = "Были в конструкторе";   }     // деструктор   function __destruct()   {     echo "Вызвали деструктор!<br />";   } } $o1 = new Fio_Class( "Иван", "Иванович", "Иванов" ); // Будет выведено "Иван", поскольку вызван конструктор echo $o1->first_name; echo "<br />"; $o2 = new Fio_Class( "Иван", "Иванович" ); // Будет выведено "Иван", поскольку снова вызван конструктор, хотя параметров и меньше echo $o2->first_name; echo "<br />"; // И снова будет вызван конструктор! $o3 = new Fio_Class(); echo $o3->init; echo "<br />"; unset( $o3 ); echo "После деструктора!<br />"; ?>

Конструктор в классах-потомках

При создании потомка конструктор класса-родителя не вызывается. Он должен быть вызван явно. То же касается и деструктора, т.е. в деструкторе потомка деструктор родителя так же должен вызываться явно.

Примеры:

<?php class Fio_Class {   public $first_name;   public $second_name;   public $family;   // конструктор   function __construct( $par1="", $par2="", $par3="" )   {     $this->first_name = $par1;     $this->second_name = $par2;     $this->family = $par3;     echo "Были в конструкторе родителя<br />";   }   // деструктор   function __destruct()   {     echo "Вызвали деструктор родителя<br />";   } } class Employer_Class extends Fio_Class {   public $department;   function __construct($par1="")   {     // явно вызываем конструктор родителя     parent::__construct();     $department = $par1;     echo "Были в конструкторе потомка<br />";   }   // деструктор   function __destruct()   {     // явно вызываем деструктор родителя     parent::__destruct();     echo "Вызвали деструктор потомка<br />";   } } $o1 = new Employer_Class( "Маркетинг" ); unset( $o1 ); ?>

6.4.4 Полиморфизм Перегрузка методов

Напомним, что в классе имя метода уникально, т.е. нельзя определить два метода с одинаковым именем и различным числом параметров. По этой причине перегрузка метода базового класса (т.е. его замена на метод класса-потомка) происходит в том случае, если в классе-потомке есть метод, совпадающий по имени с методом базового класса. Количество параметров может отличаться!

Пример:

<?php abstract class Base_Class {   public function method1( $p1, $p2 )   {     echo "Вызвали method1 базового класса<br />";   } } class Child_Class1 extends Base_Class {   // этот метод перегружает метод базового класса   public function method1( $p1 )   {     echo "Вызвали method1 класса потомка<br />";   } } class Child_Class2 extends Base_Class {   public function method2( $p1 )   {     echo "Вызвали method2 класса потомка<br />";   } } $o1 = new Child_Class1(); $o2 = new Child_Class2(); // вызвали method1 потомка $o1->method1( "1" ); // сигнатура вызова другая, но снова вызываем method1 потомка $o1->method1( "1", "2" ); // вызвали method1 родителя, поскольку в Child_Class2 метод не перегружен $o2->method1( "1", "2" ); ?>

Полиморфизм в PHP обеспечивает:

  • Возможность в классах-потомках перегрузить методы базового класса;

  • Возможность, написав программу, ссылающуюся на базовый класс, использовать вместо базового класса классы-потомки. При этом вместо перегруженных методов базового класса будут использоваться методы из классов потомков с теми же именами.