PHP.SU

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


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

> Без описания
armancho7777777 Супермодератор
Отправлено: 27 Марта, 2012 - 11:51:19
Post Id



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


Покинул форум
Сообщений всего: 4516
Дата рег-ции: Февр. 2011  


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




Всем привет!
Вопрос к гуру PHP.
Меня интересует пример реализации множественного наследования в php?
Как реализовать множественное наследование? И при этом, естественно, что бы не было минусов. В сети множество примеров, но некоторые, по словам знатоков, имеют минусы.
Вот, как этот например:
http://blog[dot]kron0s[dot]com/multiple-inheritance-php
А вот минусы:
Цитата:
схема не дает ответа на вопрос, как делать примесь (я (автор цитаты) не называю это множественным наследованием, так как оно таковым не является) с уже существующим класом?
Второе - при такой реализации уже невозможно скрыть методы, объявленные как private - их все равно можно будет вызвать из потомка. Это может стать серьезной проблемой, если есть пересечение пространства имен (вот кстати еще один неявный минус), либо же есть необходимость скрыть реализацию чего-либо от потомков.

(Отредактировано автором: 31 Января, 2014 - 19:06:34)

 
 Top
Мелкий Супермодератор
Отправлено: 27 Марта, 2012 - 12:00:14
Post Id



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


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


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




PHP не умеет множественное наследование. Всё.


-----
PostgreSQL DBA
 
 Top
armancho7777777 Супермодератор
Отправлено: 27 Марта, 2012 - 12:13:46
Post Id



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


Покинул форум
Сообщений всего: 4516
Дата рег-ции: Февр. 2011  


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




Ну тогда лучшая из худших рализаций с минимум минусов)

(Отредактировано автором: 27 Марта, 2012 - 12:16:56)

 
 Top
Panoptik
Отправлено: 27 Марта, 2012 - 12:17:31
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2496
Дата рег-ции: Нояб. 2011  
Откуда: Одесса, Украина


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




а как на счет тредов в 5.4?


-----
Just do it
 
 Top
DeepVarvar Супермодератор
Отправлено: 27 Марта, 2012 - 12:34:16
Post Id



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


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


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




Panoptik пишет:
а как на счет тредов в 5.4?
Я еще на запорожце езжу, а вы мне мерседес предлагаете... Радость
 
 Top
armancho7777777 Супермодератор
Отправлено: 27 Марта, 2012 - 12:35:32
Post Id



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


Покинул форум
Сообщений всего: 4516
Дата рег-ции: Февр. 2011  


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




DeepVarvar пишет:
Panoptik пишет:
а как на счет тредов в 5.4?
Я еще на запорожце езжу, а вы мне мерседес предлагаете... Радость

Да нет, всё отлично)
Читаю, знакомлюсь)
Уже и PHP обновил )
 
 Top
DeepVarvar Супермодератор
Отправлено: 27 Марта, 2012 - 12:40:18
Post Id



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


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


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




Мммм... Подскажите на каком хостинге уже стоит пхп 5.4?

Ато мы щас понапишем с трейтами, а потом хрен этот код запустишь на хостинге...

(Отредактировано автором: 27 Марта, 2012 - 12:41:31)

 
 Top
armancho7777777 Супермодератор
Отправлено: 27 Марта, 2012 - 12:43:05
Post Id



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


Покинул форум
Сообщений всего: 4516
Дата рег-ции: Февр. 2011  


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




DeepVarvar пишет:
Мммм... Подскажите на каком хостинге уже стоит пхп 5.4?

logol[dot]ru
Там есть отдельные сервера с php 5.3.8

Но ведь можно взять VPS и установить что надо)
300 рублей в мес. за 10Гб.

(Отредактировано автором: 27 Марта, 2012 - 13:12:24)

 
 Top
EuGen Администратор
Отправлено: 27 Марта, 2012 - 14:38:32
Post Id


Профессионал


Покинул форум
Сообщений всего: 9097
Дата рег-ции: Июнь 2007  
Откуда: Berlin


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




Тема эта очень интересная.
Но полноценную замену множественному наследованию без его поддержки в самом языке не найти. Можно попытаться заменить это примесью.
Предлагаю свой вариант, лишенный недостатков, что есть в примере в первом сообщении темы (там не указано явно, но та цитата за моим авторством).
PHP:
скопировать код в буфер обмена
  1. class Exception_Callback_Absent extends Exception
  2. {
  3.     function __construct()
  4.     {
  5.         parent::__construct();
  6.     }
  7. }
  8.  
  9. class Exception_Callback_Deny extends Exception
  10. {
  11.     function __construct()
  12.     {
  13.         parent::__construct();
  14.     }
  15. }
  16.  
  17. class Inheritance
  18. {
  19.     protected $_rgInheritance=array();
  20.     protected function createInheritance($rParent, $bAllowInstances=false)
  21.     {
  22.         $bReject=false;
  23.         if(get_class($this)!=get_class($rParent))
  24.         {
  25.             foreach($this->_rgInheritance as $rClass)
  26.             {
  27.                 if(get_class($rClass)==get_class($rParent))
  28.                 {
  29.                     $bReject=true;
  30.                     break;
  31.                 }
  32.             }
  33.         }
  34.         else
  35.         {
  36.             $bReject=true;
  37.         }
  38.         if($bAllowInstances || !$bReject)
  39.         {
  40.             $this->_rgInheritance[]=$rParent;
  41.         }
  42.     }
  43.     public function __call($sMethod, $rgParameters)
  44.     {
  45.         $fnBind = function($sMethod, $rgParameters)
  46.         {            
  47.             if(method_exists($this, $sMethod))
  48.             {
  49.                 $rReflect = new ReflectionMethod($this, $sMethod);
  50.                 if($rReflect->isPrivate())
  51.                 {
  52.                     throw new Exception_Callback_Deny();
  53.                 }
  54.                 return $this->$sMethod($rgParams);
  55.             }
  56.             else
  57.             {
  58.                 throw new Exception_Callback_Absent();
  59.             }
  60.         };
  61.         $bExecuted=false;
  62.         foreach($this->_rgInheritance as $rParent)
  63.         {
  64.             try
  65.             {
  66.                 $fnBind = $fnBind->bindTo($rParent, $rParent);
  67.                 $fnBind($sMethod, $rgParameters);
  68.                 $bExecuted=true;
  69.                 break;
  70.             }
  71.             catch(Exception_Callback_Deny $e)
  72.             {
  73.                 throw $e;
  74.             }
  75.             catch(Exception_Callback_Absent $e)
  76.             {
  77.                 continue;
  78.             }
  79.         }
  80.         if(!$bExecuted)
  81.         {
  82.             throw new Exception_Callback_Absent();
  83.         }
  84.     }
  85. }
  86.  
  87. class Foo
  88. {
  89.    public function doFoo()
  90.    {
  91.       echo('called doFoo()'.PHP_EOL);
  92.    }
  93.  
  94.    protected function protectedFoo()
  95.    {
  96.       echo('called protectedFoo()'.PHP_EOL);
  97.    }
  98. }
  99.  
  100. class Bar
  101. {
  102.    public function doBar()
  103.    {
  104.       echo('called doBar()'.PHP_EOL);
  105.    }
  106.  
  107.    private function privateBar()
  108.    {
  109.       echo('called privateBar()'.PHP_EOL);
  110.    }
  111. }
  112.  
  113. class FooBar extends Inheritance
  114. {
  115.    public function __construct()
  116.    {
  117.       $this->createInheritance(new Foo);
  118.       $this->createInheritance(new Bar);
  119.    }
  120. }
  121.  
  122. $rTest = new FooBar();
  123. $rTest->doFoo();
  124. $rTest->doBar();
  125. $rTest->protectedFoo();
  126. $rTest->privateBar();
  127. $rTest->notExists();

- очевидно, не нужны никакие модификации классов Foo и Bar, чтобы можно было провести наследование, кроме того, соблюдено правило о недоступности приватных методов классов-родителей (защищенные доступны, так как это солюдается и при обычном наследовании)
Этот пример реализации множественного наследования будет работать только в PHP 5.4


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
armancho7777777 Супермодератор
Отправлено: 27 Марта, 2012 - 14:42:11
Post Id



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


Покинул форум
Сообщений всего: 4516
Дата рег-ции: Февр. 2011  


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




Спасибо EuGen ещё раз! Улыбка
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 1 (гостей: 1, зарегистрированных: 0)
« Объектно-ориентированное программирование »


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB