Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
сети эвм / Язык PHP.doc
Скачиваний:
85
Добавлен:
17.03.2015
Размер:
2.29 Mб
Скачать

Оператор ::

Иногда внутри описания классавозникает необходимость сослаться на функции или переменные избазового класса. Бывает, что нужно ссылаться на функции вклассе, ни один представитель которого еще не создан. Как быть в таком случае? В PHP4 для этого существует специальный оператор«::»

Например, вот так можно вызвать в описании классаProgrammerфункциюshow_name()избазового классаPersonи функциюsay_hello(), заданную в описанииклассаProgrammer, когда ни одинобъектэтогоклассаеще не был создан:

<?php

class Person { // определяем класс Личности

var $first_name;

var $last_name;

function Person($t,$a){ // конструктор

$this->first_name = $t;

$this->last_name = $a;

}

function show_name(){

// метод отображает информацию о личности

echo ("Меня зовут, " .

$this->first_name . " " .

$this->last_name . "!<br>");

}

}

class Programmer extends Person{

// определяем класс

// Programmer, расширяющий Person

function set_lang($new_lang){

// метод добавляет еще

// один язык к списку известных

$this->langs[] = $new_lang;

Person::show_name();

// вызываем функцию из базового класса

echo "И я знаю теперь еще и " .

$new_lang;

}

function show_name(){

echo ("Я программист, " .

$this->first_name . " " .

$this->last_name . "!<br>");

}

function say_hello(){

echo "Привет!<br>";

}

}

Programmer::say_hello();

// вызываем функцию, когда ни

// один объект ее класса еще не создан

$new_progr = new Programmer("Вася","Сидоров");

$new_progr->set_lang("PHP");

?>

В результате работы этой программы получим следующее:

Привет!

Меня зовут Вася Сидоров!

И я знаю теперь еще и PHP

С помощью команды Programmer::say_hello();мы вызываем функциюsay_helloклассаProgrammerкак таковую, а не какметод, применяемый кобъектуданногокласса. В этот момент переменныхклассанет. Поэтому функции, вызываемые до созданияобъекта, не могут пользоваться переменнымиклассаи конструкциейthis, но могут пользоваться локальными и глобальными переменными.

В определении классаProgrammerмы переопределили функциюshow_name(), поэтому вызвать функциюshow_name()избазового классаPersonможно только с помощью оператора«::»Вообще говоря, внутри определенияклассамы можем вызывать любыеметодыисвойства, заданные в егобазовом классес помощью обычного$this, если только порожденныйклассне переопределяет этисвойстваиметоды, как в нашем примере.

Оператор parent

В приведенном выше примере, обращаясь в базовому классу, мы использовали его имя (мы писалиPerson::show_name()). Это не совсем удобно, потому что имяклассаили иерархияклассовможет измениться, и тогда придется переписывать код описаний всехклассовс тем, чтобы привести используемые в них имена в соответствие с новой иерархией. Чтобы избежать подобной ситуации, вместо именибазового классанужно использовать ключевое слово parent (например,parent::show_name()).Parentссылается накласс, прописанный послеextendsв объявлении вашегокласса. Поэтому если вдруг иерархияклассовизменится, то достаточно будет внести изменения в имена, указанные послеextendsв описанияхклассов.

Соседние файлы в папке сети эвм