Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Переопределенные функции


Автор: Golovastik 23.11.2010, 02:39
Есть такое код:
Код

<?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 раза, а не один класса-потомка?

Автор: SickFxck 23.11.2010, 02:45
Цитата(Golovastik @  23.11.2010,  02:39 Найти цитируемый пост)
Вызывался метод из класса-потомка, а потом вызвался метод класса родителя после него, почему это так?

Почему я написал
Код
<?php
echo 'A';

и вывелось "A"? Вот и с твоим кодом тоже самое.

Автор: Golovastik 23.11.2010, 02:49
Вы не поняли $b->example(), один раз написал ,а вывелось и родителя и потомка,почему?

Автор: Guedda 23.11.2010, 11:29
Цитата(Golovastik @  23.11.2010,  02:49 Найти цитируемый пост)
Вы не поняли $b->example(), один раз написал ,а вывелось и родителя и потомка,почему?

Потому что у Вас в методе потомка есть надпись A::example(); Если ее убрать, то выведется только метод потомка ;)

Автор: skyboy 23.11.2010, 11:54
у тебя страшныйнекорректный код, я удивляюсь, как оно вообще работает разработчики РНР вообще не прикрыли лавочку со статическим вызовом нестатических методов.
Цитата(Golovastik @  23.11.2010,  01:39 Найти цитируемый пост)
A::example();

тут http://ua2.php.net/manual/en/language.oop5.paamayim-nekudotayim.php:
Код

parent::example();

работает только потому, что в A::example() нет обращения к $this. впрочем, РНР должен все равно ругаться, видимо, у тебя отключен вывод ошибок на экран - потому ругань остается только в логах

Автор: NewDima 23.11.2010, 17:33
skyboy, с чего ему ругаться? =) в коде все честно

Автор: skyboy 23.11.2010, 17:56
статический вызов нестатического метода.
Код

<?php
class A {
    $a = '1';
     function example() {
         echo $this->a;
     }
}
class B extends A {
     function example() {
         echo $this->a;
         A::example();
     }
}
A::example();
// Создаем объект класса B.
$b = new B;
$b->example();
?>

приводит к 
Цитата

Fatal error:  Using $this when not in object context

потому что вместо "A::example()" должно быть "parent::example()"

Добавлено через 3 минуты и 32 секунды
Цитата(php.net/manual/en/language.oop5.static.php)

Calling non-static methods statically generates an E_STRICT level warning. 

это к слову про логи и "невыведенные на экран сообщения"

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)