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

Особенности передачи объектов в классы

Объекты в вызовы ВСЕГДА передаются по ссылке. Также присваивание объекта выполняется по ссылке. Если требуется создать копию объекта, то для этого используется конструкция clone.

Пример (пользуемся ранее определенными классами):

<?php // создаем объект $obj1 = new Fio_Class(); // вызываем метод для объекта $obj1->set_name( "Иван", "Иваныч", "Иванов" ); $obj2 = $obj1; // меняем значения свойств $obj2->set_name( "Петр", "Петрович", "Петров" ); if( $obj1->family == $obj2->family ) {   echo "Оказалось, что значение свойства изменилось в обоих объектах:<br />";   echo $obj2->family."<br>"; } $obj2 = clone $obj1; // меняем значения свойств $obj2->set_name( "Иван", "Иваныч", "Иванов" ); if( $obj1->family != $obj2->family ) {   echo "Оказалось, что значение свойства изменилось только в одном объекте:<br />";   echo $obj2->family."<br>"; } ?>

6.4.2 Наследование Пример наследования

В PHP не разрешено множественное наследование. Для задания класса родителя (базового класса) используется ключевое слово extends. Внутри класса свойства и методы родителя доступны через $this-> (для методов это верно только в случае, если они не перегружены). Для явного доступа к методу родителя используется конструкция parent::, а для доступа к любому классу в вышестоящей иерархии:

<Имя класса>::.

Пример (пользуемся ранее определенными классами):

<?php class Employer_Class extends Fio_Class {   public $department;     function set_name2($par1, $par2, $par3, $par4 )   {     // можно вызвать метод родителя так (в первую очередь будем     // искать метод с такой сигнатурой в исходном классе,     // а только потом в родителе)         $this->set_name( $par1, $par2, $par3 );     $this->department = $par4;         // можно присвоить значение свойству в родителе напрямую     $this->first_name = $par1;     // можно обратиться к вызову метода родителя так     parent::set_name ($par1, $par2, $par3 );     // а можно и так     Fio_Class::set_name ($par1, $par2, $par3 );   } } // создаем объект $obj1 = new Employer_Class(); // вызываем метод для объекта $obj1->set_name2( "Иван", "Иваныч", "Иванов", "Менеджер" ); echo $obj1->family . "<br />"; echo $obj1->department . "<br />"; ?>

Уровни доступа

Для свойств и методов можно определить уровень доступа. В PHP определены три таких уровня:

  • public (открытый): Метод/свойство доступны из любого места в коде;

  • private (закрытый): Закрытые методы или свойства доступны только внутри класса;

  • protected (защищённый): Защищённый метод или свойства доступны только внутри класса, где они были объявлены, и из его производных классов.

Для задания уровня доступа при объявлении имени свойства указывается слово, соответствующее уровню доступа (public, private и protected соответственно). Перед ключевым словом function для метода также может быть указано слово для определения уровня доступа. Если перед именем метода не указывается ключевое свойство для уровня доступа, то считается, что метод доступа public.

При объявлении свойств вместо ключевого слова public можно использовать ключевое слово var, используемое в версиях PHP, до версии 5. В старых версиях РНР ограничивать доступ к членам класса было нельзя, все члены класса неявно имели модификатор public, и для описания свойств применялось ключевое слово var. В РНР 5 использовать его рекомендуется только в целях совместимости со старыми версиями.