Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Наследование. Перегрузка методов с разным количеством параметров
Форумы портала PHP.SU » » Объектно-ориентированное программирование » Наследование. Перегрузка методов с разным количеством параметров

Страниц (1): [1]
 

1. MrAsker - 21 Июня, 2016 - 11:58:05 - перейти к сообщению
Привет всем! Есть класс A, в нем метод add($x, $y). При попытке перегрузить add($x, $y, $z) с доп. параметром из наследника A --> B выдается compatible declare error. В чем смысл этого чуда? Как в php нужно перегружать методы в таком случае?
Временно обошел проблему через func_get_arg, но это костылизм какой-то. Гуру php, нужна ваша помощь...
2. caballero - 21 Июня, 2016 - 12:08:00 - перейти к сообщению
в PHP нет полиморфизма как в других языках.
Цитата:
Временно обошел проблему через func_get_arg, но это костылизм какой-то.

add($x, $y, $z=null)
и проверяйте на null последний параметр
3. Мелкий - 21 Июня, 2016 - 12:12:53 - перейти к сообщению
Базовый класс задаёт контракт. Наследники могут по-разному реализовывать контракт, но обязаны в точности этому контракту следовать.
Это не специфика PHP - это идея ООП.

Вы не можете сказать, что реализуете контракт метода add с двумя обязательными аргументами, но требовать в потомке передачу трёх обязательных аргументов. Как не можете public метод сделать protected. Контракты несовместимы.
Но внимание на "обязательный аргумент". Если дополнительные аргументы необязательны - этот контракт совместим. protected метод базового класса можно расширить в public дочернего - такой контракт тоже совместим.

PHP:
скопировать код в буфер обмена
  1. class foo
  2. {
  3.     public function test($a, $b)
  4.     {
  5.         var_dump($a, $b);
  6.     }
  7. }
  8.  
  9. class bar extends foo
  10. {
  11.     public function test($a, $b, $c = null)
  12.     {
  13.         var_dump($a, $b, $c);
  14.     }
  15. }
  16.  
  17. (new bar)->test(1,2);
4. MrAsker - 21 Июня, 2016 - 12:29:17 - перейти к сообщению
Такой быстрый отклик, спасибо! Жалко карма не проставилась.
5. Anguis - 29 Июля, 2016 - 11:47:25 - перейти к сообщению
У меня вот тоже как раз возник вопросик по поводу соблюдения контракта. Есть простой базовый класс, реализующий простенький функционал, позволяющий загружать в себя другие объекты и массивы.
PHP:
скопировать код в буфер обмена
  1.  
  2. class standart{
  3.   function __construct($obj=false){
  4.    
  5.    
  6.     if(gettype($obj)=='array'||gettype($obj)=='object'){
  7.      
  8.       foreach($obj as $var => $val){
  9.         if(gettype($val)=='array'||gettype($val)=='object'){
  10.           $this->$var = new standart($val);
  11.         }else{
  12.           $this->$var = $val;
  13.         }
  14.       }
  15.      
  16.     }
  17.   }
  18.   public function __set($name,$param){
  19.     $this->$name=$param;
  20.   }
  21. }
  22. ?>
  23.  


Ессно, все его методы public. Но если мне нужно сделать наследуемый класс - синглтон, имеющий функционал родителя, но с private конструктором, то у меня это не выйдет :
CODE (htmlphp):
скопировать код в буфер обмена
  1. Fatal error: Access level to page::__construct() must be public (as in class standart)


Собственно вопрос в следующем - как правильно поступить в такой ситуации. Переносить код методов из одного класса в другой? Не очень красиво.. Оставить public у синглтона? Тогда это уже не синглтон.

З.Ы. ну и вообще не очень понятно почему если с паблика перегружаешь в приват то это запрещено. Здесь же как бы уровень безопасности возрастает. Вот наоборот да. С привата в паблик - согласен не есть гуд..

 

Powered by ExBB FM 1.0 RC1