Хорошо, другие люди говорят вам, что это плохая идея дизайна.Я собираюсь квази-инакомыслие и сказать вам, что, возможно, вы столкнулись с проблемной областью, где основанная на классах иерархия ОО не принесет вам всех желаний.Если вам интересна эта идея, я рекомендую прочитать «Универсальный шаблон дизайна» Стива Йегге (http://steve -yegge.blogspot.com / 2008/10 / universal-design-pattern.html ).
Но он немного скучен, так что, может быть, было бы короче и столь же интересно учитывать, что в JavaScript то, о чем вы здесь говорите, будет тривиальным:
t = new Tag({arg1: val1, arg2: val2})
// ...
// later, when you decide t is a Form
t.prototype = Form.prototype.
МногоеПричины, по которым это работает с JavaScript, связаны с его ОО, основанным на прототипах, но многое также связано с тем фактом, что функции являются первоклассными значениями, которые можно назначать переменным и передавать.В PHP есть некоторые средства для динамического вызова функций (и с 5.3 для их назначения / передачи).Я думаю, если бы вы были заинтересованы и хотели бы выйти за рамки языковых возможностей языка, вы, вероятно, могли бы сделать что-то вроде этого.
Во-первых, вы бы сделали то, что многие люди пишут-ориентированный код на языках без классов делает: ваши "классы" могут быть просто хешами / ассоциативными массивами (AA).
$quasiObj = array('prop1' => $val1, 'prop2' => $val2, '_class' => 'quasiClass');
Ваши методы могут быть просто функциями, которые принимают ссылку AA в качестве первого аргумента.
function quasiClass_method1Name($this,$args = array()) {
$this['prop1'] = $args[1] * $args[2];
}
Если вы хотите независимый от класса вызов метода, вы можете получить его с помощью функции-оболочки:
function method($this,$methodName,$args) {
$fullMethodName = "{$this['_class']}_$methodName";
$fullMethodName($this,$args);
}
// and now, the invocation
method($quasiObj,'method1Name',array(6,7));
В этой системе, когда вы хотите продвигать свой $quasiObject
изОт Tag
до Form
, просто изменить ключ _class
массива.Если необходимы внутренние изменения состояния, вы можете написать функцию / метод, чтобы позаботиться об этом.
Вы теряете переводчика, следя за вещами для вас, и некоторые люди действительно волнуются по этому поводу.Большинство из этих людей используют Java, потому что PHP играет слишком быстро и свободно для них.Это динамический язык.Воспользуйтесь этим фактом.:)