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

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Наследование. Перегрузка методов с разным количеством параметров

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Без описания
MrAsker
Отправлено: 21 Июня, 2016 - 11:58:05
Post Id


Новичок


Покинул форум
Сообщений всего: 2
Дата рег-ции: Июнь 2016  


Помог: 0 раз(а)




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


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




в PHP нет полиморфизма как в других языках.
Цитата:
Временно обошел проблему через func_get_arg, но это костылизм какой-то.

add($x, $y, $z=null)
и проверяйте на null последний параметр

(Отредактировано автором: 21 Июня, 2016 - 12:08:52)



-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
Мелкий Супермодератор
Отправлено: 21 Июня, 2016 - 12:12:53
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Базовый класс задаёт контракт. Наследники могут по-разному реализовывать контракт, но обязаны в точности этому контракту следовать.
Это не специфика 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);


-----
PostgreSQL DBA
 
 Top
MrAsker
Отправлено: 21 Июня, 2016 - 12:29:17
Post Id


Новичок


Покинул форум
Сообщений всего: 2
Дата рег-ции: Июнь 2016  


Помог: 0 раз(а)




Такой быстрый отклик, спасибо! Жалко карма не проставилась.
 
 Top
Anguis
Отправлено: 29 Июля, 2016 - 11:47:25
Post Id



Частый гость


Покинул форум
Сообщений всего: 253
Дата рег-ции: Июнь 2012  


Помог: 2 раз(а)




У меня вот тоже как раз возник вопросик по поводу соблюдения контракта. Есть простой базовый класс, реализующий простенький функционал, позволяющий загружать в себя другие объекты и массивы.
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 у синглтона? Тогда это уже не синглтон.

З.Ы. ну и вообще не очень понятно почему если с паблика перегружаешь в приват то это запрещено. Здесь же как бы уровень безопасности возрастает. Вот наоборот да. С привата в паблик - согласен не есть гуд..
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Объектно-ориентированное программирование »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB