несовместимость классов в php 5.2.10

Lightning

Трудоголик
class B extends A {
public function do($when) {
$what = //
$where = //
return parent::do($what, $where, $when);
}
}
pilot911
Объясни, зачем в этом примере перегрузка?
Чем тебя не устраивает такой вариант:
PHP:
class B extends A {
    public function doWhen( $when ) {
        $what = //
        $where = //
        return parent :: do( $what, $where, $when );
    }
}
 

berkut

Новичок
dimagolov
наскока маразм мне не изменяет, в php4 небыло abstract, protected
 

dimagolov

Новичок
ага. еще там не было __construct и поэтому конструкторы изображали ф-ии одноименные классу.
 

berkut

Новичок
dimagolov вот поэтому, посмотря на код этой либы, мона сказать, что утверждение, что писалась она под пхп4 в корне не верное.. да и суть не в этом, а в том, что поменялось поведение с резолвом конструкторов в 5.3, относительно 5.1
 

tf

крылья рулят
может все же ии нужно разрабатывать не через задний проход
 

pilot911

Новичок
Автор оригинала: Lightning
pilot911
Объясни, зачем в этом примере перегрузка?
Чем тебя не устраивает такой вариант:
PHP:
class B extends A {
    public function doWhen( $when ) {
        $what = //
        $where = //
        return parent :: do( $what, $where, $when );
    }
}
пример неверный, правильный пример такой:


PHP:
class B extends A {
    public function init( $what, $where, $when  ) {
        if ($when=10) $this->loadTemplate($where);

        return parent :: init( $what);
    }
}

вот это пример из жизни - когда потомок расширяет класс функции инициализации родителя

а что делается в функции init() родителя ?

например, читаются файлы локализации - и это делается у всех вюьверов например

просто каждый вьювер по-своему читает шаблон ( что определено в init() ) - а база (чтение мультиязычных файлов и тп) - у всех вьюверов одинаковая
 

AmdY

Пью пиво
Команда форума
Lightning
потому что можно будет вызвать B::do() и зачем тогда вообще наследование, можно писать каждый раз новый класс, новый метод.
 

Lightning

Трудоголик
потому что можно будет вызвать B::do()
При перегрузке тоже можно будет вызвать.
и зачем тогда вообще наследование, можно писать каждый раз новый класс, новый метод.
Ты и так добавляешь новый метод, только имя ему хочешь дать такое же как у другого метода.
пример неверный, правильный пример такой:

class B extends A {
public function init( $what, $where, $when ) {
if ($when=10) $this->loadTemplate($where);

return parent :: init( $what);
}
}
Хорошо, объясни зачем здесь перегрузка. Почему, например, нельзя дать другое имя методу родителя?
 

AmdY

Пью пиво
Команда форума
При перегрузке тоже можно будет вызвать.
вот именно, он и должен вызываться и выполнять действие свойственное этому классу, а не родительскому.
 

pilot911

Новичок
Автор оригинала: Lightning
При перегрузке тоже можно будет вызвать.

Ты и так добавляешь новый метод, только имя ему хочешь дать такое же как у другого метода.

Хорошо, объясни зачем здесь перегрузка. Почему, например, нельзя дать другое имя методу родителя?
да дать-то можно, но мы говорим об удобстве работы программиста - зачем мне держать в голове 2 метода, когда хватает и одного на все случаи жизни - для всех потомков?

я могу, конечно, вызывать отдельно инициализацию шаблонов, файлов мультиязычности - но есть метод ... зачем плодить еще ?
 

AmdY

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

zerkms

TDD infected
Команда форума
AmdY
в пхп нет перегрузки, которую ты привык видеть в с++ ("типичную перегрузку"). поэтому нельзя применять практику с++ в этом случае.
 

Lightning

Трудоголик
вот именно, он и должен вызываться и выполнять действие свойственное этому классу, а не родительскому.
Так при перегрузке в потомке можно будет вызвать и метод do() родителя и метод do() потомка, потому что на самом деле это два разных метода. Метод родителя же никуда не денется. Все свойства и поведение родителя переходят к потомку.
да дать-то можно, но мы говорим об удобстве работы программиста - зачем мне держать в голове 2 метода, когда хватает и одного на все случаи жизни - для всех потомков?

я могу, конечно, вызывать отдельно инициализацию шаблонов, файлов мультиязычности - но есть метод ... зачем плодить еще ?
Что плодить? У тебя и так два метода (в одном один аргумент в другом три, и ты это держишь в голове), просто имена одинаковые. Если ты поменяешь имя одного из них, что у тебя случится?
 

A1x

Новичок
если есть перегрузка методов то потомок вообще _в_принципе_ не может получить интерфейс, несовместимый с родителем - может только расширить этот интерфейс новыми или перегруженными методами.
Смысл в том чтобы объект потомка можно было использовать везде, где можно использовать объект родителя. Т.к. в пхп нет перегрузки то для этой цели ввели ограничение (это кстати все в книге "банды четырех" отлично описано - интерфейсно-ориентированное программирование)
 

zerkms

TDD infected
Команда форума
люди, то, что вы называете перегрузкой, по-настоящему называется переопределением. перегрузка это нечто другое :)
 

Lightning

Трудоголик
zerkms
Я как раз про перегрузку, а не про переопределение.

-~{}~ 13.07.09 13:29:

Переопределение это вообще жесть.
 

zerkms

TDD infected
Команда форума
Lightning
перегрузки как таковой в пхп нет. есть __set(), __get(),... вот эти вещи называются перегрузкой. ты о них?
 

A1x

Новичок
zerkms думаю нет большой разницы как называть "перегрузка" или "переопределение" - overloading
у меня тут лежит книжка по Java - цитирую чтобы не было неопределенности:
"В языке Java в пределах одного класса можно определить два или более методов, которые совместно используют одно и то же имя, но имеют разное количество параметров. Когда это имеет место, методы называют перегруженными, а о процессе говорят как о перегрузке метода. "
есть еще перегрузка операторов - это другое. думаю точно так же это можно называть "переопределение методов", "переопределение операторов" в пхп __call __get __set тоже можно сказать варианты перегрузки

UPD: хотя нет, "переопределение метода" скорее относится к наследованию,
а "перегрузка метода" может быть и в пределах одного класса
 

Lightning

Трудоголик
Вот именно, перегрузка - это определение нескольких методов с одинаковыми именами, но различными списками аргументов. Ее в ПХП нет. Переопределение - это замещение одного метода другим. Какое отношение __set() и get() имеют к перегрузке методов?
 

zerkms

TDD infected
Команда форума
Lightning
в пхп перегрузкой называются методы __set(), __get() и ещё парочка. никаеой другой перегрузки в пхп не существует. а потому как мы разговариваем о пхп, то было бы логично использовать терминологию выбранную девелоперами пхп и описанную в мануале по пхп. не?
 
Сверху