баг или фича в классах | $this VS self::

Zetruger

ivan.chistyakov.name
баг или фича в классах | $this VS self::

PHP:
<?php

class ca {
function qwe1() { $this->test_qwe(); }
function qwe2() { self::test_qwe(); }
function test_qwe() { echo 'A'; }
}

class cb extends ca {
function test_qwe() { echo 'B'; }
}

$b = new cb;
$b->qwe1();
$b->qwe2();

?>

почему при создание класса Б и вызове метода из наследуемого класса А происходит следующая вещь, а именно

если метод класса А вызывает другой метод через this, то вызывается метод из класса Б

этож бред какой-то, фактический происходит инъекция во внутреннюю логику класса А и его метода, и никакое это не переопределение


конечно это можно исправить вызывая через self::
или сделать test_qwe протектным или приватным

но черт возьми кто это придумал?
 
Re: баг или фича в классах | $this VS self::

Автор оригинала: Zetruger
но черт возьми кто это придумал?
полагаю что Алан Кэй, который описал главные черты того, что впоследствии назвали объектно-ориентированным программированием.

твоя проблема относиться к Полиморфизму
 
Полиморфизм. При полиморфизме некоторые части (методы) родительского класса заменяются новыми, реализующими специфические для данного потомка действия. Таким образом, интерфейс классов остаётся прежним, а реализация методов с одинаковым названием и набором параметров различается. С понятием «Полиморфизм» тесно связано понятие «Позднего связывания».

здесь же немного другое:
здесь не переопределена функция qwe1, но тем не менее она стала функцинировать по другому!!! чего быть не должно
 
Автор оригинала: Zetruger
здесь же немного другое:
здесь не переопределена функция qwe1, но тем не менее она стала функцинировать по другому!!! чего быть не должно
в приведенном коде согласно цитате
При полиморфизме некоторые части (методы) родительского класса (function test_qwe() { echo 'A'; }) заменяются новыми (function test_qwe() { echo 'B'; })
а метод qwe1 как вызывала метод test_qwe так и продолжает ее вызывать, но так как объект создавался как екземпляр класса cb, то соответственно метод test_qwe связывается тот, что характерен именно для класса cb
 
или сделать test_qwe протектным или приватным
ты лучше слева от слова function напиши final через пробел.. и никакой иньекции во внутреннюю логику класса, extends будет исключительно переименовывать класс.. а зачем же он еще нужен
 
здесь же немного другое:
здесь не переопределена функция qwe1, но тем не менее она стала функцинировать по другому!!! чего быть не должно
бред! И с чего одна должна быть переопределена? ты переопределил тока test_qwe()!

Да и self вообще непонятно к чему...
extends будет исключительно переименовывать класс..
да ну!
 
если метод класса А вызывает другой метод через this, то вызывается метод из класса Б
Вызывается как раз метод класса Б а не А. Если Б наследник А, то естественно, будет вызываться метод класса Б. И никакой это не бред.
здесь не переопределена функция qwe1, но тем не менее она стала функцинировать по другому!!! чего быть не должно
В данном случае вызывается метод класса Б. Все работает как надо.
бред! И с чего одна должна быть переопределена? ты переопределил тока test_qwe()!
В том то и дело. Вызывается метод класса Б. Почему должен вызываться метод класса А?
 
вот блин экспериментаторы
почитайте что-нибудь по ооп, прежде чем спорить "бред-не-бред" =)))
 
суть то в том что если этот код набрать в C++, то функция qwe1 выведет 'A', а в PHP она выводит 'B'

ооп работает по разному
 
Автор оригинала: litvinenko
дык языки же разные :)))
согласен! в этом споров нет, но ООП модель должна работать адекватно.
а то получается что программист писавший классы на СИ, не зная этих тонкостей
пока во всем разберется много дров наломает
 
Zetruger
ооп работает по разному
ООП работает одинаково. Просто в С++ методы по умолчанию НЕ виртуальные, а в php виртуальные.

-~{}~ 18.07.07 12:20:

Zetruger
пока во всем разберется много дров наломает
Если знает про виртуальные функции то не наломает.
 
в мануале написано что в php по умолчанию методы виртуальные?
можно ли это отключить?
а то жутко не охото переписывать все на self::
 
суть то в том что если этот код набрать в C++, то функция qwe1 выведет 'A', а в PHP она выводит 'B'
В джаве так же, как в пхп.
Вернее в пхп так же, как и в джаве ;)
 
Zetruger
в мануале написано что в php по умолчанию методы виртуальные?
Если я правильно перевел следующий текст, то написано. http://ru2.php.net/manual/ru/language.oop5.basic.php
Вот:
The inherited methods and members can be overridden, unless the parent class has defined a method as final, by redeclaring them within the same name defined in the parent class. It is possible to access the overridden methods or members by referencing them with parent::
можно ли это отключить?
Используя self:: можно отключить, так как self:: явно указывает на тот класс из которого мы хотим вызвать метод.
 
Сверху