Javascript-форум (https://javascript.ru/forum/)
-   Серверные языки и технологии (https://javascript.ru/forum/server/)
-   -   Переопределенные функции (https://javascript.ru/forum/server/13259-pereopredelennye-funkcii.html)

Golovastik 23.11.2010 02:30

Переопределенные функции
 
Есть такое код:
Код:

<?php
class A {
    function example() {
        echo "Это первоначальная функция A::example().<br>";
    }
}

class B extends A {
    function example() {
        echo "Это переопределенная функция B::example().<br>";
        A::example();
    }
}


A::example();

// Создаем объект класса B.
$b = new B;

$b->example();
?>

Здесь создан класс А и его наследник класс B, в классе А объявлен метод с названием example и в классе B такой же метод объявлен.

Когда я написал так: A::example();
Я просто через глобальную область видимости к классу вызывал ег о метод, это вроде понятно,но после вот этого:
$b->example();
Вызывался метод из класса-потомка, а потом вызвался метод класса родителя после него, почему это так?
Почему после этого $b->example();выводится 2 раза, а не один класса-потомка?

Gvozd 23.11.2010 07:54

Цитата:

Сообщение от Golovastik
Почему после этого $b->example();выводится 2 раза, а не один класса-потомка?

потому что вы вызываете метод класса-предка.
причем делаете это неправильно.
небходимо общатся через parent

monolithed 23.11.2010 08:35

Golovastik мне что ли вам книгу по PHP купить?

Golovastik 23.11.2010 18:28

потому что вы вызываете метод класса-предка.

То есть написав вот так:
$b->example();

Это значит вызвать и предка и потомка, так как функции с идентичными названиями?

Gvozd 24.11.2010 00:49

Golovastik,
вы что, совсем идиот?
реально, купите себе какую-нибудь книгу по PHP
и самое главное - читайте документацию.
там все вполне понятно написано. сам читал ее, и точно вам говорю, что там все заданные вами вопросы уже описаны.
Если не понимаете с первого раза, прочитайте еще раз соответствующий раздел справочника.
попробуйте написать тестовый код, для проверки механизма, если возникают сомнения.

Прежде чем задавать вопрос на форуме, повторить эту последовательность действий не менее 3х раз.
Если к третьему разу у вас так и не получилось понять механизм, и получить ответ на свой вопрос самостоятельно, то значит, либо вопрос и вправду нестандартный(что навряд ли), либо вы полный идиот.

Если вы зададите свой следующий вопрос, не потрудившись попытатся найти ответ самостоятельно, как я описал выше, то получите бан на 10 дней.


Ответ на ваш последний вопрос:
Цитата:

Сообщение от Golovastik
$b->example();

это вы вызываете метод example у объекта $b
так как объект $b является представителе класса B, то метод example ищется у него.
Так как он нашелся, то он и выполняется.
Если бы он не нашелся, то искался бы метод example у родительского класса - A
Итак, в вашем случае вызывается именно метод example, код которого описан в классе B
по-умолчанию PHP в таком случае НЕ будет вызывать метод example, код которого описан в классе A
но, вы вызываете его ПРИНУДИТЕЛЬНО, с помощью строки
A::example();

которую кстати, правильно писать так:
parent::example();


Часовой пояс GMT +3, время: 16:15.