Простой пример: <?php class A { // Выводит, функция какого класса была вызвана function Test() { echo "Test from A\n"; } // Тестовая функция — просто переадресует на Test() function Call() { Test(); } } class B extends A { // Функция Test() для класса B function Test() { echo "Test from B\n"; } } $a=new A(); $b=new B(); $a->Call(); // выводит "Test from A" $b->Test(); // выводит "Test from B" $b->Call(); // Внимание! Выводит "Test from B"! ?> В этом примере функция Call() не передает никаких данных функциям Test(), а просто их вызывает. Как поступить с функцией Call(), если необходимо передать в в функции Test() разное количество переменных? Например, функции Test($x) класса А нужно передать одну переменную, а для класса В Test($x,$y) - 2 переменных. Надеюсь на вашу помощь.
в случае, если говорим о полиморфизме, то никак. Полиморфизм подразумевает наличие методов с одинаковыми именами и сигнатурами (количиство и имена параметров должны сохраняться). PHP: <?php abstract class A { private $vars; abstract protected function Test($vars); public function get() { $vars = array(); if (func_num_args()) { foreach(func_get_args() as $v) { $vars[] = $v; } $return = $this->Test($vars); } else { $return = 'ошибка'; } return $return; } } final class B extends A { final protected function Test($vars) { return __CLASS__.':<br /><pre>'.print_r($vars,true).'</pre>'; } } final class C extends A { final protected function Test($vars) { return __CLASS__.':<br />'.count($vars); } } $b=new B(); $c=new C(); echo $b->get('1','2','3'); echo '<br />'; echo $c->get('1','2'); ?> можно вот так извернуться, по идее. А можно вообще не выделываться и просто переписать нужные методы при наследовании PHP: <?php class A { public function Test($x) { return 'Класс: '.__CLASS__.'<br />'.$x; } } final class B extends A { final public function Test($x, $y) { $return = parent::Test($x).'<br />'; $return .= 'Класс: '.__CLASS__.'<br />'.$x.' => '.$y; return $return; } } $a=new A(); $b=new B(); echo $a->Test('1'); echo '<br />'; echo $b->Test('1','2'); ?>
Luge А во втором варианте PHP разве не ругнется, что потомок должен иметь такую же сигнатуру как и предок? Или весь цимис в final?
Ах да. Забыл сказать, как это делаю я: PHP: <?php class A { public function test(array $params) { } } class B extends A { public function test(array $params) { } } ?>
ну и как это называется? В 5.3 поправили объектную модель и ни гу-гу в http://www.php.net/manual/en/migration53.changes.php ? Хотя, для абстрактных методов ошибка вылетает
ключевое слово тут - "поправили". Т.е. знания ООП достаточно, что бы знать, что это противоречит полиморфизму в принципе, независимо от полноты реализации в интерпретаторе.