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

Gorynych

Посетитель PHP-Клуба
просто добавьте параметр с умолчательным null в родителе, от вас совершенно естественно требуют совмещаемости определения методов (не верю, что обновлялись с версии выше 5.1.х без проверки строгости)
 

AmdY

Пью пиво
Команда форума
Gorynych
в том то и дело, что это не определение. таким образом полностью добивается идея полифоризма и нарушается инкапсуляция т.к. метод наследника становится зависим от родителя.
 

Lightning

Трудоголик
AmdY
от интерфейса родителя.

-~{}~ 11.07.09 22:24:

Ну нельзя в PHP делать несколько методов с одинаковыми именами и разным списком аргументов. А надо ли? Сложно сделать разные имена?
 

pilot911

Новичок
Автор оригинала: Lightning
AmdY
от интерфейса родителя.

-~{}~ 11.07.09 22:24:

Ну нельзя в PHP делать несколько методов с одинаковыми именами и разным списком аргументов. А надо ли? Сложно сделать разные имена?
надо, конечно

например, когда вьюверы наследуют один класс, причем, главный вьювер содержит более расширенную функцию инициализации

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

fixxxer

К.О.
Партнер клуба
если у тебя descendants требуют инициализации отличной от предков тебе стоит сесть и хорошенько подумать о наследовании и базовых принципах ооп
 

pilot911

Новичок
Автор оригинала: fixxxer
если у тебя descendants требуют инициализации отличной от предков тебе стоит сесть и хорошенько подумать о наследовании и базовых принципах ооп
зачем заведомо ограничивать гибкость языка? почему в сях не так?
 

dimagolov

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

fixxxer

К.О.
Партнер клуба
Если ты про с++ то там все иначе, нашел с чем сравнить. Но там тебе тоже никто не даст положить МПХ на совместимость интерфейсов - ты обязан явно, в декларации конструктора, указать правильный вызов parent-конструктора. В php же нет конструкции, аналогичной
class TB: public TA {
public:
TB(int x, int y): TA(x)

а вообще это еще та жопа, этот ваш c++. Миллионы способов выстрелить себе в ногу. Одна перегрузка операторов чего стоит.
 

AmdY

Пью пиво
Команда форума
вот, пилот привёл хороший пример, когда предок как раз используется как урезаная версия с ограниченым поведением многофункционального предка.
class B extends A {
public function do($when) {
$what = //
$where = //
return parent::do($what, $where, $when);
}
}
 

berkut

Новичок
мне вот при переходе c 5.1 на 5.3 либа морфиер фаталити стала делать
PHP:
abstract class phpMorphy_Morphier_Common extends phpMorphy_Morphier_Base {
    protected function getAnnotSize() { return 15; }
    
    protected function decodeAnnot($annotRaw) {
        /* ... */
    }
}
/* обрезанный ниже */
class phpMorphy_Morphier_DictBulk extends phpMorphy_Morphier_Common {
    function phpMorphy_Morphier_DictBulk() {
        parent::phpMorphy_Morphier_Common($fsa, $graminfo);
        //parent::__construct($fsa, $graminfo); // mod
    }
}
new phpMorphy_Morphier_DictBulk();
 

fixxxer

К.О.
Партнер клуба
Автор оригинала: AmdY
вот, пилот привёл хороший пример, когда предок как раз используется как урезаная версия с ограниченым поведением многофункционального предка.
class B extends A {
public function do($when) {
$what = //
$where = //
return parent::do($what, $where, $when);
}
}
И весь полиморфизм в жопу.

$objects = array(new A, new B);
foreach ($objects as $object) {
$object->do($what); // упс
}
 

pilot911

Новичок
Автор оригинала: fixxxer
И весь полиморфизм в жопу.

$objects = array(new A, new B);
foreach ($objects as $object) {
$object->do($what); // упс
}
это частности - малая часть, когда м возникнуть конфликт

наиболее востребованный момент - это как раз таки перегрузка методов, облегчающая работу программиста
 

dimagolov

Новичок
berkut, чего еще ожидать от кода, написанного под PHP 4

Если тебе нравится либа, но она не развивалась со времен PHP4, то помоги проекту, переведи ее под стандарты PHP 5.3 (а в ближайшем обозримом будущем и PHP 6)
 

Lightning

Трудоголик
pilot911
AmdY
В ООП потомок наследует ВЕСЬ интерфейс предка.
Если ты видишь, что нужно наследовать только кусок интерфейса, значит код спроектирован неправильно.

Исправить несложно:
Если необходимо наследовать часть интерфейса, делаешь выделение интерфейса.
Если необходимо наследовать часть реализации, делаешь выделение суперкласса, если не получается, то выделение класса и замену наследования агрегацией.
 

pilot911

Новичок
Правила перегрузки

Они очень просты. Функции должны отличаться количеством или хотя бы типом аргументов. Причём типы должны отличаться принципиально. Это то, что влияет на перегрузку.
 

dimagolov

Новичок
pilot911, пойми, когда разрабатывали общие концепции ООП, то нифига не имели опыта ООП разработки, по крайней мере долгосрочного. А вот когда такой опыт появился, то оказалось, что не всякий полиморфизм одинаково полезен, часто он становится средством прострелить себе ногу.
Разработчики PHP на данном этапе считают, что язык должен не реализовывать парадигму ООП абстрактно, а делать это так, чтобы упрощать разработку, а значит по меньшей усложнять возможности выстрелить себе в ногу и помогать поддерживать хорошую архитектуру, а иногда прямо запрещать создавать плохую. Изменение интерфейсов при наследовании это плохая архитектура, попросту это говнокод.
 
Сверху