Опубликован: 01.03.2005 | Уровень: для всех | Доступ: платный
Лекция 6:

Объекты и классы в PHP

< Лекция 5 || Лекция 6: 123456 || Лекция 7 >

Наследование

extends

Механизм наследования – очень важная часть всего объектно-ориентированного подхода. Попытаемся объяснить его суть на примере. Допустим, мы создаем описание человека. Очевидно, что сделать это мы можем по-разному, в зависимости от того, для чего нужно это описание. Можно описать человека как программиста: он знает такие-то языки программирования, операционные системы, участвовал в стольких-то проектах. Однако если человек программист, то он не перестает быть человеком вообще, т.е. он имеет имя, фамилию, место жительства и т.п. Если перевести наши рассуждения в термины объектно-ориентированного программирования, то можно сказать, что мы описали два классакласс людей и класс программистов, каждый со своими свойствами и методами. Причем класс программистов, очевидно, обладает всеми свойствами класса людей и при этом имеет свои специфические характеристики, т.е. класс программистов является подклассом класса людей. Так, если у человека вообще есть имя, то у программиста оно тоже должно быть, но не наоборот. Кроме программистов можно выделить еще множество классов по профессиональной принадлежности людей. И все они будут подклассами класса людей. Часто на практике удобно определять общий класс, который может использоваться сразу в нескольких проектах (например, класс людей или личностей), и адаптировать его для специфических нужд каждого проекта (например, как класс программистов). Как это можно реализовать? С помощью механизма расширений. Любой класс может быть расширением другого класса. Расширяющий (или производный) класс, кроме тех свойств и методов, которые описаны в его определении, имеет все функции и свойства основного ( базового класса ). В нашем примере класс программистов – расширяющий, а класс всех людей – базовый. Из класса нельзя удалить никакие существующие свойства и функции, класс можно только расширить. Расширяющий класс в PHP4 всегда зависит только от одного базового класса, поскольку множественное наследование в PHP не поддерживается. Расширяются классы в PHP с помощью ключевого слова extends.

<?php
class Person { // определяем класс Личности
  var $first_name; // имя личности
  var $last_name; // фамилия личности
  function make_person($t,$a){ 
  // метод устанавливает
  // значения имени и фамилии объекта
    $this->first_name = $t;
    $this->last_name = $a;
  }
  function show_person(){ 
  // метод отображает информацию о личности
    echo ("<h2>" . $this->first_name . " " .
      $this->last_name . "</h2>");
  }
}
class Programmer extends Person{ 
    // определяем класс
    // Programmer, расширяющий Person
  var $langs = array ("Lisp"); 
    // константным массивом
    // задать переменную в var можно
    function set_lang($new_lang){ 
    // метод добавляет еще
    // один язык к списку известных
    $this->langs[] = $new_lang;
  }
}
?>
Пример 6.3. Использование механизма наследования

Класс Programmer имеет те же переменные и функции, что и класс Person, плюс переменную $langs, в которой содержится список изученных программистом языков, и функцию set_lang для добавления еще одного языка к списку изученных. Создать представителя класса программистов можно обычным способом с помощью конструкции new. После этого можно устанавливать и получать список языков, которые знает программист, и в то же время можно использовать функции, заданные для класса Person, т.е. устанавливать и получать имя и фамилию программиста и отображать сведения о нем в браузере:

<?php
$progr = new Programmer;
$progr->set_lang("PHP"); 
    // методы, определенные для
    // класса Programmer
print_r ($progr->langs);
// методы, определенные для класса Person
$progr->make_person("Bill","Gates");
$progr->show_person();
?>

Отношения, в которых состоят созданные нами классы Person и Programmer, называют также отношениями родитель–потомок. Класс Person – родитель, а его потомки, такие как класс Programmer, создаются, основываясь на нем, с помощью расширений. Любой класс может стать родительским и соответственно породить потомков.

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

< Лекция 5 || Лекция 6: 123456 || Лекция 7 >
Федор Антонов
Федор Антонов

Здравствуйте!

Записался на ваш курс, но не понимаю как произвести оплату.

Надо ли писать заявление и, если да, то куда отправлять?

как я получу диплом о профессиональной переподготовке?

Сергей Крупко
Сергей Крупко

Добрый день.

Я сейчас прохожу курс  повышения квалификации  - "Профессиональное веб-программирование". Мне нужно получить диплом по этому курсу. Я так полагаю нужно его оплатить чтобы получить диплом о повышении квалификации. Как мне оплатить этот курс?

 

Сергей Пантелеев
Сергей Пантелеев
Россия, Москва
Ахмет Арчаков
Ахмет Арчаков
Россия, Магас

( ! ) Warning: include_once(./includes/unicode.entities.inc) [<a href='function.include-once'>function.include-once</a>]: failed to open stream: No such file or directory in /.2/var_www_new.intuit.ru/htdocs/includes/unicode.inc on line 340
Call Stack
#TimeMemoryFunctionLocation
14.2860102215840watchdog( )../bootstrap.inc:0
24.2863102218304module_invoke( )../bootstrap.inc:967
34.2863102220160call_user_func_array ( )../module.inc:462
44.2863102220496devel_watchdog( )../module.inc:462
54.2864102221344decode_entities( )../devel.module:382
64.2864102223264drupal_error_handler( )../devel.module:340
74.2865102226872watchdog( )../common.inc:663
84.2865102228936module_invoke( )../bootstrap.inc:967
94.2865102230792call_user_func_array ( )../module.inc:462
104.2865102231128devel_watchdog( )../module.inc:462
114.2865102231824decode_entities( )../devel.module:382

( ! ) Warning: include_once() [<a href='function.include'>function.include</a>]: Failed opening './includes/unicode.entities.inc' for inclusion (include_path='.:/usr/local/zend/var/libraries/Zend_Framework_1/default/library:/usr/local/zend/share/pear') in /.2/var_www_new.intuit.ru/htdocs/includes/unicode.inc on line 340
Call Stack
#TimeMemoryFunctionLocation
14.2860102215840watchdog( )../bootstrap.inc:0
24.2863102218304module_invoke( )../bootstrap.inc:967
34.2863102220160call_user_func_array ( )../module.inc:462
44.2863102220496devel_watchdog( )../module.inc:462
54.2864102221344decode_entities( )../devel.module:382
64.2864102223264drupal_error_handler( )../devel.module:340
74.2865102226872watchdog( )../common.inc:663
84.2865102228936module_invoke( )../bootstrap.inc:967
94.2865102230792call_user_func_array ( )../module.inc:462
104.2865102231128devel_watchdog( )../module.inc:462
114.2865102231824decode_entities( )../devel.module:382

( ! ) Warning: include_once(./includes/unicode.entities.inc) [<a href='function.include-once'>function.include-once</a>]: failed to open stream: No such file or directory in /.2/var_www_new.intuit.ru/htdocs/includes/unicode.inc on line 340
Call Stack
#TimeMemoryFunctionLocation
14.2860102215840watchdog( )../bootstrap.inc:0
24.2863102218304module_invoke( )../bootstrap.inc:967
34.2863102220160call_user_func_array ( )../module.inc:462
44.2863102220496devel_watchdog( )../module.inc:462
54.2864102221344decode_entities( )../devel.module:382
64.2872102223456drupal_error_handler( )../devel.module:340
74.2873102227144watchdog( )../common.inc:663
84.2873102229208module_invoke( )../bootstrap.inc:967
94.2873102231064call_user_func_array ( )../module.inc:462
104.2873102231400devel_watchdog( )../module.inc:462
114.2873102232176decode_entities( )../devel.module:382

( ! ) Warning: include_once() [<a href='function.include'>function.include</a>]: Failed opening './includes/unicode.entities.inc' for inclusion (include_path='.:/usr/local/zend/var/libraries/Zend_Framework_1/default/library:/usr/local/zend/share/pear') in /.2/var_www_new.intuit.ru/htdocs/includes/unicode.inc on line 340
Call Stack
#TimeMemoryFunctionLocation
14.2860102215840watchdog( )../bootstrap.inc:0
24.2863102218304module_invoke( )../bootstrap.inc:967
34.2863102220160call_user_func_array ( )../module.inc:462
44.2863102220496devel_watchdog( )../module.inc:462
54.2864102221344decode_entities( )../devel.module:382
64.2872102223456drupal_error_handler( )../devel.module:340
74.2873102227144watchdog( )../common.inc:663
84.2873102229208module_invoke( )../bootstrap.inc:967
94.2873102231064call_user_func_array ( )../module.inc:462
104.2873102231400devel_watchdog( )../module.inc:462
114.2873102232176decode_entities( )../devel.module:382

( ! ) Warning: include_once(./includes/unicode.entities.inc) [<a href='function.include-once'>function.include-once</a>]: failed to open stream: No such file or directory in /.2/var_www_new.intuit.ru/htdocs/includes/unicode.inc on line 340
Call Stack
#TimeMemoryFunctionLocation
14.2878102216384watchdog( )../bootstrap.inc:0
24.2878102218448module_invoke( )../bootstrap.inc:967
34.2878102220304call_user_func_array ( )../module.inc:462
44.2878102220640devel_watchdog( )../module.inc:462
54.2879102221344decode_entities( )../devel.module:382
64.2879102223264drupal_error_handler( )../devel.module:340
74.2879102226872watchdog( )../common.inc:663
84.2879102228936module_invoke( )../bootstrap.inc:967
94.2879102230792call_user_func_array ( )../module.inc:462
104.2879102231128devel_watchdog( )../module.inc:462
114.2880102231824decode_entities( )../devel.module:382

( ! ) Warning: include_once() [<a href='function.include'>function.include</a>]: Failed opening './includes/unicode.entities.inc' for inclusion (include_path='.:/usr/local/zend/var/libraries/Zend_Framework_1/default/library:/usr/local/zend/share/pear') in /.2/var_www_new.intuit.ru/htdocs/includes/unicode.inc on line 340
Call Stack
#TimeMemoryFunctionLocation
14.2878102216384watchdog( )../bootstrap.inc:0
24.2878102218448module_invoke( )../bootstrap.inc:967
34.2878102220304call_user_func_array ( )../module.inc:462
44.2878102220640devel_watchdog( )../module.inc:462
54.2879102221344decode_entities( )../devel.module:382
64.2879102223264drupal_error_handler( )../devel.module:340
74.2879102226872watchdog( )../common.inc:663
84.2879102228936module_invoke( )../bootstrap.inc:967
94.2879102230792call_user_func_array ( )../module.inc:462
104.2879102231128devel_watchdog( )../module.inc:462
114.2880102231824decode_entities( )../devel.module:382

( ! ) Warning: include_once(./includes/unicode.entities.inc) [<a href='function.include-once'>function.include-once</a>]: failed to open stream: No such file or directory in /.2/var_www_new.intuit.ru/htdocs/includes/unicode.inc on line 340
Call Stack
#TimeMemoryFunctionLocation
14.2878102216384watchdog( )../bootstrap.inc:0
24.2878102218448module_invoke( )../bootstrap.inc:967
34.2878102220304call_user_func_array ( )../module.inc:462
44.2878102220640devel_watchdog( )../module.inc:462
54.2879102221344decode_entities( )../devel.module:382
64.2884102223456drupal_error_handler( )../devel.module:340
74.2884102227144watchdog( )../common.inc:663
84.2884102229208module_invoke( )../bootstrap.inc:967
94.2885102231064call_user_func_array ( )../module.inc:462
104.2885102231400devel_watchdog( )../module.inc:462
114.2885102232176decode_entities( )../devel.module:382

( ! ) Warning: include_once() [<a href='function.include'>function.include</a>]: Failed opening './includes/unicode.entities.inc' for inclusion (include_path='.:/usr/local/zend/var/libraries/Zend_Framework_1/default/library:/usr/local/zend/share/pear') in /.2/var_www_new.intuit.ru/htdocs/includes/unicode.inc on line 340
Call Stack
#TimeMemoryFunctionLocation
14.2878102216384watchdog( )../bootstrap.inc:0
24.2878102218448module_invoke( )../bootstrap.inc:967
34.2878102220304call_user_func_array ( )../module.inc:462
44.2878102220640devel_watchdog( )../module.inc:462
54.2879102221344decode_entities( )../devel.module:382
64.2884102223456drupal_error_handler( )../devel.module:340
74.2884102227144watchdog( )../common.inc:663
84.2884102229208module_invoke( )../bootstrap.inc:967
94.2885102231064call_user_func_array ( )../module.inc:462
104.2885102231400devel_watchdog( )../module.inc:462
114.2885102232176decode_entities( )../devel.module:382