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
Форумы портала PHP.SU » » Объектно-ориентированное программирование » Множественное наследование в php

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

1. armancho7777777 - 27 Марта, 2012 - 11:51:19 - перейти к сообщению
Всем привет!
Вопрос к гуру PHP.
Меня интересует пример реализации множественного наследования в php?
Как реализовать множественное наследование? И при этом, естественно, что бы не было минусов. В сети множество примеров, но некоторые, по словам знатоков, имеют минусы.
Вот, как этот например:
http://blog[dot]kron0s[dot]com/multiple-inheritance-php
А вот минусы:
Цитата:
схема не дает ответа на вопрос, как делать примесь (я (автор цитаты) не называю это множественным наследованием, так как оно таковым не является) с уже существующим класом?
Второе - при такой реализации уже невозможно скрыть методы, объявленные как private - их все равно можно будет вызвать из потомка. Это может стать серьезной проблемой, если есть пересечение пространства имен (вот кстати еще один неявный минус), либо же есть необходимость скрыть реализацию чего-либо от потомков.
2. Мелкий - 27 Марта, 2012 - 12:00:14 - перейти к сообщению
PHP не умеет множественное наследование. Всё.
3. armancho7777777 - 27 Марта, 2012 - 12:13:46 - перейти к сообщению
Ну тогда лучшая из худших рализаций с минимум минусов)
4. Panoptik - 27 Марта, 2012 - 12:17:31 - перейти к сообщению
а как на счет тредов в 5.4?
5. DeepVarvar - 27 Марта, 2012 - 12:34:16 - перейти к сообщению
Panoptik пишет:
а как на счет тредов в 5.4?
Я еще на запорожце езжу, а вы мне мерседес предлагаете... Радость
6. armancho7777777 - 27 Марта, 2012 - 12:35:32 - перейти к сообщению
DeepVarvar пишет:
Panoptik пишет:
а как на счет тредов в 5.4?
Я еще на запорожце езжу, а вы мне мерседес предлагаете... Радость

Да нет, всё отлично)
Читаю, знакомлюсь)
Уже и PHP обновил )
7. DeepVarvar - 27 Марта, 2012 - 12:40:18 - перейти к сообщению
Мммм... Подскажите на каком хостинге уже стоит пхп 5.4?

Ато мы щас понапишем с трейтами, а потом хрен этот код запустишь на хостинге...
8. armancho7777777 - 27 Марта, 2012 - 12:43:05 - перейти к сообщению
DeepVarvar пишет:
Мммм... Подскажите на каком хостинге уже стоит пхп 5.4?

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

Но ведь можно взять VPS и установить что надо)
300 рублей в мес. за 10Гб.
9. EuGen - 27 Марта, 2012 - 14:38:32 - перейти к сообщению
Тема эта очень интересная.
Но полноценную замену множественному наследованию без его поддержки в самом языке не найти. Можно попытаться заменить это примесью.
Предлагаю свой вариант, лишенный недостатков, что есть в примере в первом сообщении темы (там не указано явно, но та цитата за моим авторством).
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
10. armancho7777777 - 27 Марта, 2012 - 14:42:11 - перейти к сообщению
Спасибо EuGen ещё раз! Улыбка

 

Powered by ExBB FM 1.0 RC1