баг или фича в классах | $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 протектным или приватным

но черт возьми кто это придумал?
 

iamFake

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

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

твоя проблема относиться к Полиморфизму
 

Zetruger

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

здесь же немного другое:
здесь не переопределена функция qwe1, но тем не менее она стала функцинировать по другому!!! чего быть не должно
 

dimagolov

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

Андрейка

Senior pomidor developer
или сделать test_qwe протектным или приватным
ты лучше слева от слова function напиши final через пробел.. и никакой иньекции во внутреннюю логику класса, extends будет исключительно переименовывать класс.. а зачем же он еще нужен
 

AP

Новичок
здесь же немного другое:
здесь не переопределена функция qwe1, но тем не менее она стала функцинировать по другому!!! чего быть не должно
бред! И с чего одна должна быть переопределена? ты переопределил тока test_qwe()!

Да и self вообще непонятно к чему...
extends будет исключительно переименовывать класс..
да ну!
 

planarik

Новичок
если метод класса А вызывает другой метод через this, то вызывается метод из класса Б
Вызывается как раз метод класса Б а не А. Если Б наследник А, то естественно, будет вызываться метод класса Б. И никакой это не бред.
здесь не переопределена функция qwe1, но тем не менее она стала функцинировать по другому!!! чего быть не должно
В данном случае вызывается метод класса Б. Все работает как надо.
бред! И с чего одна должна быть переопределена? ты переопределил тока test_qwe()!
В том то и дело. Вызывается метод класса Б. Почему должен вызываться метод класса А?
 

StUV

Rotaredom
вот блин экспериментаторы
почитайте что-нибудь по ооп, прежде чем спорить "бред-не-бред" =)))
 

Zetruger

ivan.chistyakov.name
суть то в том что если этот код набрать в C++, то функция qwe1 выведет 'A', а в PHP она выводит 'B'

ооп работает по разному
 

Zetruger

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

phprus

Moderator
Команда форума
Zetruger
ооп работает по разному
ООП работает одинаково. Просто в С++ методы по умолчанию НЕ виртуальные, а в php виртуальные.

-~{}~ 18.07.07 12:20:

Zetruger
пока во всем разберется много дров наломает
Если знает про виртуальные функции то не наломает.
 

Zetruger

ivan.chistyakov.name
в мануале написано что в php по умолчанию методы виртуальные?
можно ли это отключить?
а то жутко не охото переписывать все на self::
 

nerezus

Вселенский отказник
суть то в том что если этот код набрать в C++, то функция qwe1 выведет 'A', а в PHP она выводит 'B'
В джаве так же, как в пхп.
Вернее в пхп так же, как и в джаве ;)
 

phprus

Moderator
Команда форума
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:: явно указывает на тот класс из которого мы хотим вызвать метод.
 
Сверху