<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
		>
<channel>
	<title>Комментарии на сайте FractalizeR's WebSite</title>
	<atom:link href="http://ru.fractalizer.ru/comments/feed/" rel="self" type="application/rss+xml" />
	<link>http://ru.fractalizer.ru</link>
	<description>Часть моего сайта, содержащая контент, специфичный для России</description>
	<lastBuildDate>Sat, 13 Nov 2010 22:51:15 +0000</lastBuildDate>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
	<item>
		<title>Комментарий к записи ООП практикум в PHP5: Анализ ошибок, преимуществ и недостатков двух реализаций примесей в PHP (FractalizeR)</title>
		<link>http://ru.fractalizer.ru/frpost_148/%d0%be%d0%be%d0%bf-%d0%bf%d1%80%d0%b0%d0%ba%d1%82%d0%b8%d0%ba%d1%83%d0%bc-%d0%b2-php5-%d0%b0%d0%bd%d0%b0%d0%bb%d0%b8%d0%b7-%d0%be%d1%88%d0%b8%d0%b1%d0%be%d0%ba-%d0%bf%d1%80%d0%b5%d0%b8%d0%bc%d1%83/comment-page-1/#comment-98</link>
		<dc:creator>FractalizeR</dc:creator>
		<pubDate>Sat, 13 Nov 2010 22:51:15 +0000</pubDate>
		<guid isPermaLink="false">http://ru.fractalizer.ru/?p=148#comment-98</guid>
		<description>&lt;blockquote&gt;1. кеширование здесь не нужно, оно у вас есть от того, что ваша модель не оптимальна.&lt;/blockquote&gt;
Поясните. На мой взгляд оптимальность модели тут ни при чем. Попробуйте добавить штук 10 примесей с 10 методами каждая в вашу реализацию и посмотрите на скорость. Кэширование понижает временные затраты на вызов методов. Нужно оно или нет говорить можно только применительно к какой-то конкретной ситуации, когда мы поймем, &quot;тормозит&quot; данная конкретная вещь или нет. Я напоминаю, что мы рассматриваем только концепт. Как вы можете говорить, что что-то не нужно, если у вас еще даже ситуации нет, которую можно было бы рассматривать?

&lt;blockquote&gt;защищенные поля не нужны, ведь сама идея множественного наследования чужда для пхп, и ради нее я готов отказаться от глупых надписей protrcted и private. вы для кого их пишете? мне главное чтобы работало, быстро, хорошо, умно и оптимально. надписи private и protected этому никак не способствуют, толи дело множественное наследование.&lt;/blockquote&gt;
Я в отличие от вас от protected и private отказаться не готов. Но это просто наши личные предпочтения. Опять же напоминаю, что мы рассматриваем концепт, а не его применение в конкретном проекте.

&lt;blockquote&gt;далее. ваша реализация такая же. все добавляется ран тайм. у меня тоже, это всего лишь пример, где вы добавите примеси, в конструкторах, еще в каких то методах – не важно, главное что вы их гдето, да добавите. я делаю тоже так же. просто тупо внизу, потому что это пример реализации.&lt;/blockquote&gt;
Да, но есть разница. В моей реализации регистрацию примесей можно произвести заранее. Это может сделать, например, плагин стороннего разработчика без изменения кода моей системы. У меня регистрация не требует загрузки ни класса примеси, ни класса агрегатора. У вас это невозможно. Опять же, мы рассматриваем концепт и мы не можем сейчас сказать, что важно, а что нет.

Я просто сейчас объясняю, чем наши реализации отличаются. Кстати, в вашей концепции есть одна хорошая идея, которой, похоже, вы сами не заметили. Примесь к примеси :) Я подумаю об этом. Спасибо за пример.

P.S. Возьмите мою модель и уберите из нее кеширование. Как вам? Разве намного сложнее, чем ваша?</description>
		<content:encoded><![CDATA[<blockquote><p>1. кеширование здесь не нужно, оно у вас есть от того, что ваша модель не оптимальна.</p></blockquote>
<p>Поясните. На мой взгляд оптимальность модели тут ни при чем. Попробуйте добавить штук 10 примесей с 10 методами каждая в вашу реализацию и посмотрите на скорость. Кэширование понижает временные затраты на вызов методов. Нужно оно или нет говорить можно только применительно к какой-то конкретной ситуации, когда мы поймем, &laquo;тормозит&raquo; данная конкретная вещь или нет. Я напоминаю, что мы рассматриваем только концепт. Как вы можете говорить, что что-то не нужно, если у вас еще даже ситуации нет, которую можно было бы рассматривать?</p>
<blockquote><p>защищенные поля не нужны, ведь сама идея множественного наследования чужда для пхп, и ради нее я готов отказаться от глупых надписей protrcted и private. вы для кого их пишете? мне главное чтобы работало, быстро, хорошо, умно и оптимально. надписи private и protected этому никак не способствуют, толи дело множественное наследование.</p></blockquote>
<p>Я в отличие от вас от protected и private отказаться не готов. Но это просто наши личные предпочтения. Опять же напоминаю, что мы рассматриваем концепт, а не его применение в конкретном проекте.</p>
<blockquote><p>далее. ваша реализация такая же. все добавляется ран тайм. у меня тоже, это всего лишь пример, где вы добавите примеси, в конструкторах, еще в каких то методах – не важно, главное что вы их гдето, да добавите. я делаю тоже так же. просто тупо внизу, потому что это пример реализации.</p></blockquote>
<p>Да, но есть разница. В моей реализации регистрацию примесей можно произвести заранее. Это может сделать, например, плагин стороннего разработчика без изменения кода моей системы. У меня регистрация не требует загрузки ни класса примеси, ни класса агрегатора. У вас это невозможно. Опять же, мы рассматриваем концепт и мы не можем сейчас сказать, что важно, а что нет.</p>
<p>Я просто сейчас объясняю, чем наши реализации отличаются. Кстати, в вашей концепции есть одна хорошая идея, которой, похоже, вы сами не заметили. Примесь к примеси <img src='http://ru.fractalizer.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Я подумаю об этом. Спасибо за пример.</p>
<p>P.S. Возьмите мою модель и уберите из нее кеширование. Как вам? Разве намного сложнее, чем ваша?</p>
]]></content:encoded>
	</item>
	<item>
		<title>Комментарий к записи ООП практикум в PHP5: Анализ ошибок, преимуществ и недостатков двух реализаций примесей в PHP (joker2k1)</title>
		<link>http://ru.fractalizer.ru/frpost_148/%d0%be%d0%be%d0%bf-%d0%bf%d1%80%d0%b0%d0%ba%d1%82%d0%b8%d0%ba%d1%83%d0%bc-%d0%b2-php5-%d0%b0%d0%bd%d0%b0%d0%bb%d0%b8%d0%b7-%d0%be%d1%88%d0%b8%d0%b1%d0%be%d0%ba-%d0%bf%d1%80%d0%b5%d0%b8%d0%bc%d1%83/comment-page-1/#comment-97</link>
		<dc:creator>joker2k1</dc:creator>
		<pubDate>Sat, 13 Nov 2010 21:56:10 +0000</pubDate>
		<guid isPermaLink="false">http://ru.fractalizer.ru/?p=148#comment-97</guid>
		<description>ok :)  я хотел показать вам идею, вы ее не увидели :)

1. кеширование здесь не нужно, оно у вас есть от того, что ваша модель не оптимальна.
2. защищенные поля не нужны, ведь сама идея множественного наследования чужда для пхп, и ради нее я готов отказаться от глупых надписей protrcted и private. вы для кого их пишете? мне главное чтобы работало, быстро, хорошо, умно и оптимально. надписи private и protected этому никак не способствуют, толи дело множественное наследование.
3. название класса взято с потолка - чем оно хуже ваших названий? :))) это всего лишь набор букв - зрите в корень.
4. финальная реализация, уже вылизанная, но без отлова ошибок, если надо могу добавить, это все детали - главное суть.

  class base9 {
    
    var $__minh = array();
    
    // 
    
    function __call($method, $params) {
      
      foreach($this-&gt;__minh as $minhObj) 
        
        if (method_exists($minhObj,$method))
                
          return call_user_func_array(array($minhObj, $method), $params);
      
      throw new Exception(&quot;Unknown method $method\n&quot;);
      
    }
    
    function __get($name) {
      
      foreach($this-&gt;__minh as $minhObj) 
                
        if (property_exists($minhObj, $name)) 
        
          //return $minhObj-&gt;__minh_get($name);
          return $minhObj-&gt;$name;
          
      throw new Exception(&quot;Unknown property $name\n&quot;);
      
    }
    
    function __set($name, $value) {
      
      foreach($this-&gt;__minh as $minhObj) 
                
        if (property_exists($minhObj, $name)) {
        
          $minhObj-&gt;$name = $value;
          
          return;
          
        }
          
      throw new Exception(&quot;Unknown property $name\n&quot;);
      
    }
        
    function __minh_set($name, $value) {
      
      $this-&gt;$name = $value;
            
    }
  
    //
    
    function __minh_add($obj) {
      
      $this-&gt;__minh[] = $obj;
      
    }
    
  }

далее. ваша реализация такая же. все добавляется ран тайм. у меня тоже, это всего лишь пример, где вы добавите примеси, в конструкторах, еще в каких то методах - не важно, главное что вы их гдето, да добавите. я делаю тоже так же. просто тупо внизу, потому что это пример реализации.

с уважением, евгений :)</description>
		<content:encoded><![CDATA[<p>ok <img src='http://ru.fractalizer.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />   я хотел показать вам идею, вы ее не увидели <img src='http://ru.fractalizer.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>1. кеширование здесь не нужно, оно у вас есть от того, что ваша модель не оптимальна.<br />
2. защищенные поля не нужны, ведь сама идея множественного наследования чужда для пхп, и ради нее я готов отказаться от глупых надписей protrcted и private. вы для кого их пишете? мне главное чтобы работало, быстро, хорошо, умно и оптимально. надписи private и protected этому никак не способствуют, толи дело множественное наследование.<br />
3. название класса взято с потолка &#8211; чем оно хуже ваших названий? <img src='http://ru.fractalizer.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> )) это всего лишь набор букв &#8211; зрите в корень.<br />
4. финальная реализация, уже вылизанная, но без отлова ошибок, если надо могу добавить, это все детали &#8211; главное суть.</p>
<p>  class base9 {</p>
<p>    var $__minh = array();</p>
<p>    // </p>
<p>    function __call($method, $params) {</p>
<p>      foreach($this-&gt;__minh as $minhObj) </p>
<p>        if (method_exists($minhObj,$method))</p>
<p>          return call_user_func_array(array($minhObj, $method), $params);</p>
<p>      throw new Exception(&laquo;Unknown method $method\n&raquo;);</p>
<p>    }</p>
<p>    function __get($name) {</p>
<p>      foreach($this-&gt;__minh as $minhObj) </p>
<p>        if (property_exists($minhObj, $name)) </p>
<p>          //return $minhObj-&gt;__minh_get($name);<br />
          return $minhObj-&gt;$name;</p>
<p>      throw new Exception(&laquo;Unknown property $name\n&raquo;);</p>
<p>    }</p>
<p>    function __set($name, $value) {</p>
<p>      foreach($this-&gt;__minh as $minhObj) </p>
<p>        if (property_exists($minhObj, $name)) {</p>
<p>          $minhObj-&gt;$name = $value;</p>
<p>          return;</p>
<p>        }</p>
<p>      throw new Exception(&laquo;Unknown property $name\n&raquo;);</p>
<p>    }</p>
<p>    function __minh_set($name, $value) {</p>
<p>      $this-&gt;$name = $value;</p>
<p>    }</p>
<p>    //</p>
<p>    function __minh_add($obj) {</p>
<p>      $this-&gt;__minh[] = $obj;</p>
<p>    }</p>
<p>  }</p>
<p>далее. ваша реализация такая же. все добавляется ран тайм. у меня тоже, это всего лишь пример, где вы добавите примеси, в конструкторах, еще в каких то методах &#8211; не важно, главное что вы их гдето, да добавите. я делаю тоже так же. просто тупо внизу, потому что это пример реализации.</p>
<p>с уважением, евгений <img src='http://ru.fractalizer.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
	</item>
	<item>
		<title>Комментарий к записи Примеси VS делегирование: преимущества и недостатки при реализации &#171;плагинов&#187; (FractalizeR)</title>
		<link>http://ru.fractalizer.ru/frpost_154/%d0%bf%d1%80%d0%b8%d0%bc%d0%b5%d1%81%d0%b8-vs-%d0%b4%d0%b5%d0%bb%d0%b5%d0%b3%d0%b8%d1%80%d0%be%d0%b2%d0%b0%d0%bd%d0%b8%d0%b5-%d0%bf%d1%80%d0%b5%d0%b8%d0%bc%d1%83%d1%89%d0%b5%d1%81%d1%82%d0%b2%d0%b0/comment-page-1/#comment-96</link>
		<dc:creator>FractalizeR</dc:creator>
		<pubDate>Sat, 13 Nov 2010 20:48:20 +0000</pubDate>
		<guid isPermaLink="false">http://ru.fractalizer.ru/?p=154#comment-96</guid>
		<description>&lt;blockquote&gt;Да я просто не хочу, чтобы вас за зря минусовали. Там только дай повод.
&lt;/blockquote&gt;
Согласен, я слежу :) Изложение получилось несколько скомканым и недодуманным. Поторопился, наверное. Но в целом, вроде ничего. Посмотрим, что будет дальше, хотя уже видно, что ажиотаж не создан :) Может, ночь на дворе? :)

&lt;blockquote&gt;В родительском классе добавляется метод, который ссылается на метод нового класса.&lt;/blockquote&gt;
По условию задачи это невозможно. Плагины пишут сторонние разработчики и их добавление в проект не должно требовать модификации кода.

&lt;blockquote&gt;Естественно. Именно этим примесь и разрушает инкапсуляцию.&lt;/blockquote&gt;
Что ж, хоть в чистом ООП это и плохо, но вот скажем, в Ruby инкапсуляции в том смысле, в каком вы сейчас использовали это слово, вообще нет. То есть, любой класс может получить доступ к любому полю другого. И ничего. Я не сторонник догм, каких бы то ни было. Любое правило можно нарушить, если готов взять на себя ответственность за это. Конечно, открывать доступ к скрытым членам - плохо. И делать это нужно с большой осторожностью, если делать вообще. Для новичков - это смерть, конечно. Но я бы, хоть и с большим скрипом, реализовал бы такое решение, если бы увидел, что это наряду с привнесенными недостатками дает мне такие преимущества, которые недостатки перевешивают. Судить нужно осторожно и всегда строго после знакомства с ситуацией.</description>
		<content:encoded><![CDATA[<blockquote><p>Да я просто не хочу, чтобы вас за зря минусовали. Там только дай повод.
</p></blockquote>
<p>Согласен, я слежу <img src='http://ru.fractalizer.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Изложение получилось несколько скомканым и недодуманным. Поторопился, наверное. Но в целом, вроде ничего. Посмотрим, что будет дальше, хотя уже видно, что ажиотаж не создан <img src='http://ru.fractalizer.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Может, ночь на дворе? <img src='http://ru.fractalizer.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<blockquote><p>В родительском классе добавляется метод, который ссылается на метод нового класса.</p></blockquote>
<p>По условию задачи это невозможно. Плагины пишут сторонние разработчики и их добавление в проект не должно требовать модификации кода.</p>
<blockquote><p>Естественно. Именно этим примесь и разрушает инкапсуляцию.</p></blockquote>
<p>Что ж, хоть в чистом ООП это и плохо, но вот скажем, в Ruby инкапсуляции в том смысле, в каком вы сейчас использовали это слово, вообще нет. То есть, любой класс может получить доступ к любому полю другого. И ничего. Я не сторонник догм, каких бы то ни было. Любое правило можно нарушить, если готов взять на себя ответственность за это. Конечно, открывать доступ к скрытым членам &#8211; плохо. И делать это нужно с большой осторожностью, если делать вообще. Для новичков &#8211; это смерть, конечно. Но я бы, хоть и с большим скрипом, реализовал бы такое решение, если бы увидел, что это наряду с привнесенными недостатками дает мне такие преимущества, которые недостатки перевешивают. Судить нужно осторожно и всегда строго после знакомства с ситуацией.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Комментарий к записи ООП практикум в PHP5: Анализ ошибок, преимуществ и недостатков двух реализаций примесей в PHP (FractalizeR)</title>
		<link>http://ru.fractalizer.ru/frpost_148/%d0%be%d0%be%d0%bf-%d0%bf%d1%80%d0%b0%d0%ba%d1%82%d0%b8%d0%ba%d1%83%d0%bc-%d0%b2-php5-%d0%b0%d0%bd%d0%b0%d0%bb%d0%b8%d0%b7-%d0%be%d1%88%d0%b8%d0%b1%d0%be%d0%ba-%d0%bf%d1%80%d0%b5%d0%b8%d0%bc%d1%83/comment-page-1/#comment-95</link>
		<dc:creator>FractalizeR</dc:creator>
		<pubDate>Sat, 13 Nov 2010 20:46:25 +0000</pubDate>
		<guid isPermaLink="false">http://ru.fractalizer.ru/?p=148#comment-95</guid>
		<description>Дело в том, что помещение всего функционала в один класс - это не всегда хорошо. Вам сейчас кажется, что это просто и это, может быть, действительно так. Но попробуйте сейчас добавить в вашу модель кеширование доступа как у меня, возможность доступа примеси к защищенным полям агрегатора как у Леонида или у меня? Код сильно вырастет и его станет труднее поддерживать. А потом попробуйте добавить возможность выбора произвольного механизма кеширования в проекте. Что станет тогда? А механизм проверки типов на этапе подмешивания с регистрацией?

Ваш код не слишком понятен, а base9 вообще странное имя для примера :) Что оно значает? Почему 9?

Проследите граф вызовов при вызове метода. __call -&gt; __minh_isMethodExists -&gt; method_exists -&gt; __minh_method -&gt; method_exists. Зачем двойная проверка?

Ваша модель требует загрузки всех классов для подмешивания и требует подмешивания на уровне объектов. Не вызвал __minh_add = ничего не подмешалось. Для добавления в класс примеси придется проследить все случаи инстанциации и добавить вызов __minh_add везде. В моем случае все решается одной строкой на проект. Даже у Леонида достаточно один вызов в конструкторе добавить. Это неудобно. Еще неудобнее простого делегирования, как мне кажется.</description>
		<content:encoded><![CDATA[<p>Дело в том, что помещение всего функционала в один класс &#8211; это не всегда хорошо. Вам сейчас кажется, что это просто и это, может быть, действительно так. Но попробуйте сейчас добавить в вашу модель кеширование доступа как у меня, возможность доступа примеси к защищенным полям агрегатора как у Леонида или у меня? Код сильно вырастет и его станет труднее поддерживать. А потом попробуйте добавить возможность выбора произвольного механизма кеширования в проекте. Что станет тогда? А механизм проверки типов на этапе подмешивания с регистрацией?</p>
<p>Ваш код не слишком понятен, а base9 вообще странное имя для примера <img src='http://ru.fractalizer.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Что оно значает? Почему 9?</p>
<p>Проследите граф вызовов при вызове метода. __call -> __minh_isMethodExists -> method_exists -> __minh_method -> method_exists. Зачем двойная проверка?</p>
<p>Ваша модель требует загрузки всех классов для подмешивания и требует подмешивания на уровне объектов. Не вызвал __minh_add = ничего не подмешалось. Для добавления в класс примеси придется проследить все случаи инстанциации и добавить вызов __minh_add везде. В моем случае все решается одной строкой на проект. Даже у Леонида достаточно один вызов в конструкторе добавить. Это неудобно. Еще неудобнее простого делегирования, как мне кажется.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Комментарий к записи Примеси VS делегирование: преимущества и недостатки при реализации &#171;плагинов&#187; (OZ)</title>
		<link>http://ru.fractalizer.ru/frpost_154/%d0%bf%d1%80%d0%b8%d0%bc%d0%b5%d1%81%d0%b8-vs-%d0%b4%d0%b5%d0%bb%d0%b5%d0%b3%d0%b8%d1%80%d0%be%d0%b2%d0%b0%d0%bd%d0%b8%d0%b5-%d0%bf%d1%80%d0%b5%d0%b8%d0%bc%d1%83%d1%89%d0%b5%d1%81%d1%82%d0%b2%d0%b0/comment-page-1/#comment-94</link>
		<dc:creator>OZ</dc:creator>
		<pubDate>Sat, 13 Nov 2010 20:29:57 +0000</pubDate>
		<guid isPermaLink="false">http://ru.fractalizer.ru/?p=154#comment-94</guid>
		<description>Ваша аргументация показалась мне слабой в этом моменте.
Да я просто не хочу, чтобы вас за зря минусовали. Там только дай повод.

Не примеси – нарушение инкапсуляции, а возможность примеси изменять защищенные поля агрегата.
Естественно. Именно этим примесь и разрушает инкапсуляцию.

как в случае с делегированием проблема добавления функционала в ORM сторонними разработчиками из моего примера будет решаться легко и просто?
Хоть в вашем примере, хоть в каком другом - создаётся новый класс, который выполняет новый функционал. В родительском классе добавляется метод, который ссылается на метод нового класса.</description>
		<content:encoded><![CDATA[<p>Ваша аргументация показалась мне слабой в этом моменте.<br />
Да я просто не хочу, чтобы вас за зря минусовали. Там только дай повод.</p>
<p>Не примеси – нарушение инкапсуляции, а возможность примеси изменять защищенные поля агрегата.<br />
Естественно. Именно этим примесь и разрушает инкапсуляцию.</p>
<p>как в случае с делегированием проблема добавления функционала в ORM сторонними разработчиками из моего примера будет решаться легко и просто?<br />
Хоть в вашем примере, хоть в каком другом &#8211; создаётся новый класс, который выполняет новый функционал. В родительском классе добавляется метод, который ссылается на метод нового класса.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Комментарий к записи ООП практикум в PHP5: Анализ ошибок, преимуществ и недостатков двух реализаций примесей в PHP (joker2k1)</title>
		<link>http://ru.fractalizer.ru/frpost_148/%d0%be%d0%be%d0%bf-%d0%bf%d1%80%d0%b0%d0%ba%d1%82%d0%b8%d0%ba%d1%83%d0%bc-%d0%b2-php5-%d0%b0%d0%bd%d0%b0%d0%bb%d0%b8%d0%b7-%d0%be%d1%88%d0%b8%d0%b1%d0%be%d0%ba-%d0%bf%d1%80%d0%b5%d0%b8%d0%bc%d1%83/comment-page-1/#comment-93</link>
		<dc:creator>joker2k1</dc:creator>
		<pubDate>Sat, 13 Nov 2010 19:51:38 +0000</pubDate>
		<guid isPermaLink="false">http://ru.fractalizer.ru/?p=148#comment-93</guid>
		<description>ой. чета код не весь. еще раз.

[codesyntax lang=&quot;php&quot;]
&lt;?php
  class base9 {
    var $__minh = array();
    // 
    function __call($method, $params) {
      foreach($this-&gt;__minh as $minhObj) 
        if ($minhObj-&gt;__minh_isMethodExists($method))
          return $minhObj-&gt;__minh_method($method, $params);
      throw new Exception(&quot;Unknown method $method\n&quot;);
    }
    function __get($name) {
      foreach($this-&gt;__minh as $minhObj) 
        if ($minhObj-&gt;__minh_isPropertyExists($name))
          return $minhObj-&gt;__minh_get($name);
  
      throw new Exception(&quot;Unknown property $name\n&quot;);
    }
    function __set($name, $value) {
      foreach($this-&gt;__minh as $minhObj) 
        if ($minhObj-&gt;__minh_isPropertyExists($name)) {
          $minhObj-&gt;__minh_set($name, $value);
  
          return;
  
        }
  
      throw new Exception(&quot;Unknown property $name\n&quot;);
    }
    // multi inheritance 
    function __minh_isMethodExists($method) {
      return method_exists($this, $method);
    }
    function __minh_isPropertyExists($name) {
      return property_exists($this, $name);
    }
    function __minh_method($method, $values) {
      if (method_exists($this, $method))
        return call_user_func_array(array($this, $method), $values);
    }
    function __minh_get($name) {
      if (property_exists($this, $name))
        return $this-&gt;$name;
    }
    function __minh_set($name, $value) {
      if (property_exists($this, $name))
        $this-&gt;$name = $value;
    
    }
    //
    function __minh_add($obj) {
      $this-&gt;__minh[] = $obj;
    }
  }
  //
  class A extends base9 {
    var $z;
    function Say($text) {
      echo $text;
    }
  }
  class B extends base9 {
    var $p;
    function SayTwice($text) {
 
      echo $text.$text; 
    }
  }
  class C extends base9 {
    var $a = 0;
    function SetTimes($a) {
      $this-&gt;a = $a;
    }
    function SayN($text) {
      for($i=0;$ia;$i++)
        echo $text;
    }
  }
  $test = new A();
  $test-&gt;Say(&quot;test&quot;);
  $test-&gt;__minh_add( new B() );
  $test-&gt;SayTwice(&quot;gogo&quot;);
  $test-&gt;z = 10;
  $test-&gt;p = 5;
  echo $test-&gt;p;
  $test-&gt;__minh_add( new C() );
  $test-&gt;a = 3;
  $test-&gt;SayN(&quot;t&quot;);
[/codesyntax]
  
может это сподвигнет вас на еще одну статью, с разбором полетов :)</description>
		<content:encoded><![CDATA[<p>ой. чета код не весь. еще раз.</p>
<div id="wpshdo_1" class="wp-synhighlighter-outer">
<div id="wpshdt_1" class="wp-synhighlighter-expanded">
<table border="0" width="100%">
<tr>
<td align="left" width="80%"><a name="#codesyntax_1"></a><a id="wpshat_1" class="wp-synhighlighter-title" href="#codesyntax_1"  onClick="javascript:wpsh_toggleBlock(1)" title="Нажмите, чтобы показать или скрыть блок кода">Исходный код</a></td>
<td align="right"><a href="#codesyntax_1" onClick="javascript:wpsh_code(1)" title="Показать код отдельно"><img border="0" style="border: 0 none" src="http://ru.fractalizer.ru/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_1" onClick="javascript:wpsh_print(1)" title="Напечатать код"><img border="0" style="border: 0 none" src="http://ru.fractalizer.ru/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="http://ru.fractalizer.ru/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Показать информацию о плагине"><img border="0" style="border: 0 none" src="http://ru.fractalizer.ru/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td>
</tr>
</table>
</div>
<div id="wpshdi_1" class="wp-synhighlighter-inner" style="display: block;">
<pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
  <span style="color: #000000; font-weight: bold;">class</span> base9 <span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">var</span> <span style="color: #000088;">$__minh</span> <span style="color: #339933;">=</span> <a href="http://www.php.net/array"><span style="color: #990000;">array</span></a><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #666666; font-style: italic;">// </span>
    <span style="color: #000000; font-weight: bold;">function</span> __call<span style="color: #009900;">&#40;</span><span style="color: #000088;">$method</span><span style="color: #339933;">,</span> <span style="color: #000088;">$params</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #b1b100;">foreach</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>__minh <span style="color: #b1b100;">as</span> <span style="color: #000088;">$minhObj</span><span style="color: #009900;">&#41;</span>
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$minhObj</span><span style="color: #339933;">-&gt;</span>__minh_isMethodExists<span style="color: #009900;">&#40;</span><span style="color: #000088;">$method</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
          <span style="color: #b1b100;">return</span> <span style="color: #000088;">$minhObj</span><span style="color: #339933;">-&gt;</span>__minh_method<span style="color: #009900;">&#40;</span><span style="color: #000088;">$method</span><span style="color: #339933;">,</span> <span style="color: #000088;">$params</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      throw <span style="color: #000000; font-weight: bold;">new</span> Exception<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Unknown method <span style="color: #006699; font-weight: bold;">$method</span><span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #000000; font-weight: bold;">function</span> __get<span style="color: #009900;">&#40;</span><span style="color: #000088;">$name</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #b1b100;">foreach</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>__minh <span style="color: #b1b100;">as</span> <span style="color: #000088;">$minhObj</span><span style="color: #009900;">&#41;</span>
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$minhObj</span><span style="color: #339933;">-&gt;</span>__minh_isPropertyExists<span style="color: #009900;">&#40;</span><span style="color: #000088;">$name</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
          <span style="color: #b1b100;">return</span> <span style="color: #000088;">$minhObj</span><span style="color: #339933;">-&gt;</span>__minh_get<span style="color: #009900;">&#40;</span><span style="color: #000088;">$name</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
      throw <span style="color: #000000; font-weight: bold;">new</span> Exception<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Unknown property <span style="color: #006699; font-weight: bold;">$name</span><span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #000000; font-weight: bold;">function</span> __set<span style="color: #009900;">&#40;</span><span style="color: #000088;">$name</span><span style="color: #339933;">,</span> <span style="color: #000088;">$value</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #b1b100;">foreach</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>__minh <span style="color: #b1b100;">as</span> <span style="color: #000088;">$minhObj</span><span style="color: #009900;">&#41;</span>
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$minhObj</span><span style="color: #339933;">-&gt;</span>__minh_isPropertyExists<span style="color: #009900;">&#40;</span><span style="color: #000088;">$name</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
          <span style="color: #000088;">$minhObj</span><span style="color: #339933;">-&gt;</span>__minh_set<span style="color: #009900;">&#40;</span><span style="color: #000088;">$name</span><span style="color: #339933;">,</span> <span style="color: #000088;">$value</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
          <span style="color: #b1b100;">return</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #009900;">&#125;</span>
&nbsp;
      throw <span style="color: #000000; font-weight: bold;">new</span> Exception<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Unknown property <span style="color: #006699; font-weight: bold;">$name</span><span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #666666; font-style: italic;">// multi inheritance </span>
    <span style="color: #000000; font-weight: bold;">function</span> __minh_isMethodExists<span style="color: #009900;">&#40;</span><span style="color: #000088;">$method</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #b1b100;">return</span> <a href="http://www.php.net/method_exists"><span style="color: #990000;">method_exists</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">,</span> <span style="color: #000088;">$method</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #000000; font-weight: bold;">function</span> __minh_isPropertyExists<span style="color: #009900;">&#40;</span><span style="color: #000088;">$name</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #b1b100;">return</span> property_exists<span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">,</span> <span style="color: #000088;">$name</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #000000; font-weight: bold;">function</span> __minh_method<span style="color: #009900;">&#40;</span><span style="color: #000088;">$method</span><span style="color: #339933;">,</span> <span style="color: #000088;">$values</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><a href="http://www.php.net/method_exists"><span style="color: #990000;">method_exists</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">,</span> <span style="color: #000088;">$method</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
        <span style="color: #b1b100;">return</span> <a href="http://www.php.net/call_user_func_array"><span style="color: #990000;">call_user_func_array</span></a><span style="color: #009900;">&#40;</span><a href="http://www.php.net/array"><span style="color: #990000;">array</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">,</span> <span style="color: #000088;">$method</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$values</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #000000; font-weight: bold;">function</span> __minh_get<span style="color: #009900;">&#40;</span><span style="color: #000088;">$name</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>property_exists<span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">,</span> <span style="color: #000088;">$name</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
        <span style="color: #b1b100;">return</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #000088;">$name</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #000000; font-weight: bold;">function</span> __minh_set<span style="color: #009900;">&#40;</span><span style="color: #000088;">$name</span><span style="color: #339933;">,</span> <span style="color: #000088;">$value</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>property_exists<span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">,</span> <span style="color: #000088;">$name</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #000088;">$name</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$value</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #009900;">&#125;</span>
    <span style="color: #666666; font-style: italic;">//</span>
    <span style="color: #000000; font-weight: bold;">function</span> __minh_add<span style="color: #009900;">&#40;</span><span style="color: #000088;">$obj</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>__minh<span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$obj</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
  <span style="color: #009900;">&#125;</span>
  <span style="color: #666666; font-style: italic;">//</span>
  <span style="color: #000000; font-weight: bold;">class</span> A <span style="color: #000000; font-weight: bold;">extends</span> base9 <span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">var</span> <span style="color: #000088;">$z</span><span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">function</span> Say<span style="color: #009900;">&#40;</span><span style="color: #000088;">$text</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$text</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
  <span style="color: #009900;">&#125;</span>
  <span style="color: #000000; font-weight: bold;">class</span> B <span style="color: #000000; font-weight: bold;">extends</span> base9 <span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">var</span> <span style="color: #000088;">$p</span><span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">function</span> SayTwice<span style="color: #009900;">&#40;</span><span style="color: #000088;">$text</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
      <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$text</span><span style="color: #339933;">.</span><span style="color: #000088;">$text</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
  <span style="color: #009900;">&#125;</span>
  <span style="color: #000000; font-weight: bold;">class</span> C <span style="color: #000000; font-weight: bold;">extends</span> base9 <span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">var</span> <span style="color: #000088;">$a</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">function</span> SetTimes<span style="color: #009900;">&#40;</span><span style="color: #000088;">$a</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">a</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$a</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #000000; font-weight: bold;">function</span> SayN<span style="color: #009900;">&#40;</span><span style="color: #000088;">$text</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$i</span><span style="color: #339933;">=</span><span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span><span style="color: #000088;">$ia</span><span style="color: #339933;">;</span><span style="color: #000088;">$i</span><span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
        <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$text</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
  <span style="color: #009900;">&#125;</span>
  <span style="color: #000088;">$test</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> A<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #000088;">$test</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">Say</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;test&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #000088;">$test</span><span style="color: #339933;">-&gt;</span>__minh_add<span style="color: #009900;">&#40;</span> <span style="color: #000000; font-weight: bold;">new</span> B<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #000088;">$test</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">SayTwice</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;gogo&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #000088;">$test</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">z</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">10</span><span style="color: #339933;">;</span>
  <span style="color: #000088;">$test</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">p</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">5</span><span style="color: #339933;">;</span>
  <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$test</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">p</span><span style="color: #339933;">;</span>
  <span style="color: #000088;">$test</span><span style="color: #339933;">-&gt;</span>__minh_add<span style="color: #009900;">&#40;</span> <span style="color: #000000; font-weight: bold;">new</span> C<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #000088;">$test</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">a</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">3</span><span style="color: #339933;">;</span>
  <span style="color: #000088;">$test</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">SayN</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;t&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre>
</div>
</div>
<p>может это сподвигнет вас на еще одну статью, с разбором полетов <img src='http://ru.fractalizer.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
	</item>
	<item>
		<title>Комментарий к записи ООП практикум в PHP5: Анализ ошибок, преимуществ и недостатков двух реализаций примесей в PHP (joker2k1)</title>
		<link>http://ru.fractalizer.ru/frpost_148/%d0%be%d0%be%d0%bf-%d0%bf%d1%80%d0%b0%d0%ba%d1%82%d0%b8%d0%ba%d1%83%d0%bc-%d0%b2-php5-%d0%b0%d0%bd%d0%b0%d0%bb%d0%b8%d0%b7-%d0%be%d1%88%d0%b8%d0%b1%d0%be%d0%ba-%d0%bf%d1%80%d0%b5%d0%b8%d0%bc%d1%83/comment-page-1/#comment-92</link>
		<dc:creator>joker2k1</dc:creator>
		<pubDate>Sat, 13 Nov 2010 19:49:24 +0000</pubDate>
		<guid isPermaLink="false">http://ru.fractalizer.ru/?p=148#comment-92</guid>
		<description>добрый вечер.
прочитал ваши обе статьи на хабре, меня это очень заинтересовало. на хабре логина у меня нет, и инвайт не от кого полчить, поэтому пишу тут :)
чтото не пойму, почему вы все так сложно делаете? и вы и ваш коллега чтото перемудрили.
зачем два класса? 

__minh as $minhObj) 
        
        if ($minhObj-&gt;__minh_isMethodExists($method))
        
          return $minhObj-&gt;__minh_method($method, $params);      
      
      throw new Exception(&quot;Unknown method $method\n&quot;);
      
    }
    
    function __get($name) {
      
      foreach($this-&gt;__minh as $minhObj) 
        
        if ($minhObj-&gt;__minh_isPropertyExists($name))
        
          return $minhObj-&gt;__minh_get($name);
          
      throw new Exception(&quot;Unknown property $name\n&quot;);
      
    }
    
    function __set($name, $value) {
      
      foreach($this-&gt;__minh as $minhObj) 
        
        if ($minhObj-&gt;__minh_isPropertyExists($name)) {
        
          $minhObj-&gt;__minh_set($name, $value);
          
          return;
          
        }
          
      throw new Exception(&quot;Unknown property $name\n&quot;);
      
    }
    
    // multi inheritance 
    
    function __minh_isMethodExists($method) {
      
      return method_exists($this, $method);
      
    }
    
    function __minh_isPropertyExists($name) {
      
      return property_exists($this, $name);
      
    }
    
    function __minh_method($method, $values) {
      
      if (method_exists($this, $method))
        return call_user_func_array(array($this, $method), $values);
      
    }
    
    function __minh_get($name) {
      
      if (property_exists($this, $name))
        return $this-&gt;$name;
      
    }
    
    function __minh_set($name, $value) {
      
      if (property_exists($this, $name))
        $this-&gt;$name = $value;
            
    }
  
    //
    
    function __minh_add($obj) {
      
      $this-&gt;__minh[] = $obj;
      
    }
    
  }
  
  //
  
  class A extends base9 {
    
    var $z;
    
    function Say($text) {
      
      echo $text;
      
    }
    
  }
  
  class B extends base9 {
    
    var $p;
    
    function SayTwice($text) {
     
      echo $text.$text; 
      
    }    
    
  }
  
  class C extends base9 {
    
    var $a = 0;
    
    function SetTimes($a) {
      
      $this-&gt;a = $a;
      
    }
    
    function SayN($text) {
      
      for($i=0;$ia;$i++)
        echo $text;
      
    }
    
  }
  
  
  
  $test = new A();
  $test-&gt;Say(&quot;test&quot;);
  $test-&gt;__minh_add( new B() );
  $test-&gt;SayTwice(&quot;gogo&quot;);
  
  $test-&gt;z = 10;
  $test-&gt;p = 5;
  
  echo $test-&gt;p;
  
  $test-&gt;__minh_add( new C() );
  $test-&gt;a = 3;
  $test-&gt;SayN(&quot;t&quot;);
  
?&gt;

вот один класс, может быть и примесью, и примешиваться к чему угодно :) по сути множественное наследование ран-тайм.

там не стал вдаваться в детали, главное идея.
если будет интересно, пишите jokervaio@gmail.com
может инвайтом поделитесь, мне хабр понравился :)</description>
		<content:encoded><![CDATA[<p>добрый вечер.<br />
прочитал ваши обе статьи на хабре, меня это очень заинтересовало. на хабре логина у меня нет, и инвайт не от кого полчить, поэтому пишу тут <img src='http://ru.fractalizer.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
чтото не пойму, почему вы все так сложно делаете? и вы и ваш коллега чтото перемудрили.<br />
зачем два класса? </p>
<p>__minh as $minhObj) </p>
<p>        if ($minhObj-&gt;__minh_isMethodExists($method))</p>
<p>          return $minhObj-&gt;__minh_method($method, $params);      </p>
<p>      throw new Exception(&laquo;Unknown method $method\n&raquo;);</p>
<p>    }</p>
<p>    function __get($name) {</p>
<p>      foreach($this-&gt;__minh as $minhObj) </p>
<p>        if ($minhObj-&gt;__minh_isPropertyExists($name))</p>
<p>          return $minhObj-&gt;__minh_get($name);</p>
<p>      throw new Exception(&laquo;Unknown property $name\n&raquo;);</p>
<p>    }</p>
<p>    function __set($name, $value) {</p>
<p>      foreach($this-&gt;__minh as $minhObj) </p>
<p>        if ($minhObj-&gt;__minh_isPropertyExists($name)) {</p>
<p>          $minhObj-&gt;__minh_set($name, $value);</p>
<p>          return;</p>
<p>        }</p>
<p>      throw new Exception(&laquo;Unknown property $name\n&raquo;);</p>
<p>    }</p>
<p>    // multi inheritance </p>
<p>    function __minh_isMethodExists($method) {</p>
<p>      return method_exists($this, $method);</p>
<p>    }</p>
<p>    function __minh_isPropertyExists($name) {</p>
<p>      return property_exists($this, $name);</p>
<p>    }</p>
<p>    function __minh_method($method, $values) {</p>
<p>      if (method_exists($this, $method))<br />
        return call_user_func_array(array($this, $method), $values);</p>
<p>    }</p>
<p>    function __minh_get($name) {</p>
<p>      if (property_exists($this, $name))<br />
        return $this-&gt;$name;</p>
<p>    }</p>
<p>    function __minh_set($name, $value) {</p>
<p>      if (property_exists($this, $name))<br />
        $this-&gt;$name = $value;</p>
<p>    }</p>
<p>    //</p>
<p>    function __minh_add($obj) {</p>
<p>      $this-&gt;__minh[] = $obj;</p>
<p>    }</p>
<p>  }</p>
<p>  //</p>
<p>  class A extends base9 {</p>
<p>    var $z;</p>
<p>    function Say($text) {</p>
<p>      echo $text;</p>
<p>    }</p>
<p>  }</p>
<p>  class B extends base9 {</p>
<p>    var $p;</p>
<p>    function SayTwice($text) {</p>
<p>      echo $text.$text; </p>
<p>    }    </p>
<p>  }</p>
<p>  class C extends base9 {</p>
<p>    var $a = 0;</p>
<p>    function SetTimes($a) {</p>
<p>      $this-&gt;a = $a;</p>
<p>    }</p>
<p>    function SayN($text) {</p>
<p>      for($i=0;$ia;$i++)<br />
        echo $text;</p>
<p>    }</p>
<p>  }</p>
<p>  $test = new A();<br />
  $test-&gt;Say(&laquo;test&raquo;);<br />
  $test-&gt;__minh_add( new B() );<br />
  $test-&gt;SayTwice(&laquo;gogo&raquo;);</p>
<p>  $test-&gt;z = 10;<br />
  $test-&gt;p = 5;</p>
<p>  echo $test-&gt;p;</p>
<p>  $test-&gt;__minh_add( new C() );<br />
  $test-&gt;a = 3;<br />
  $test-&gt;SayN(&laquo;t&raquo;);</p>
<p>?&gt;</p>
<p>вот один класс, может быть и примесью, и примешиваться к чему угодно <img src='http://ru.fractalizer.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  по сути множественное наследование ран-тайм.</p>
<p>там не стал вдаваться в детали, главное идея.<br />
если будет интересно, пишите <a href="mailto:jokervaio@gmail.com">jokervaio@gmail.com</a><br />
может инвайтом поделитесь, мне хабр понравился <img src='http://ru.fractalizer.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
	</item>
	<item>
		<title>Комментарий к записи Примеси VS делегирование: преимущества и недостатки при реализации &#171;плагинов&#187; (FractalizeR)</title>
		<link>http://ru.fractalizer.ru/frpost_154/%d0%bf%d1%80%d0%b8%d0%bc%d0%b5%d1%81%d0%b8-vs-%d0%b4%d0%b5%d0%bb%d0%b5%d0%b3%d0%b8%d1%80%d0%be%d0%b2%d0%b0%d0%bd%d0%b8%d0%b5-%d0%bf%d1%80%d0%b5%d0%b8%d0%bc%d1%83%d1%89%d0%b5%d1%81%d1%82%d0%b2%d0%b0/comment-page-1/#comment-91</link>
		<dc:creator>FractalizeR</dc:creator>
		<pubDate>Sat, 13 Nov 2010 19:36:04 +0000</pubDate>
		<guid isPermaLink="false">http://ru.fractalizer.ru/?p=154#comment-91</guid>
		<description>Я изменил заголовок статьи, чтобы он более полно отражал обсуждаемый момент, поскольку мне показалось, что в первый раз я необосновано заявил об охвате чересчур большого количества материала</description>
		<content:encoded><![CDATA[<p>Я изменил заголовок статьи, чтобы он более полно отражал обсуждаемый момент, поскольку мне показалось, что в первый раз я необосновано заявил об охвате чересчур большого количества материала</p>
]]></content:encoded>
	</item>
	<item>
		<title>Комментарий к записи Примеси VS делегирование: преимущества и недостатки при реализации &#171;плагинов&#187; (FractalizeR)</title>
		<link>http://ru.fractalizer.ru/frpost_154/%d0%bf%d1%80%d0%b8%d0%bc%d0%b5%d1%81%d0%b8-vs-%d0%b4%d0%b5%d0%bb%d0%b5%d0%b3%d0%b8%d1%80%d0%be%d0%b2%d0%b0%d0%bd%d0%b8%d0%b5-%d0%bf%d1%80%d0%b5%d0%b8%d0%bc%d1%83%d1%89%d0%b5%d1%81%d1%82%d0%b2%d0%b0/comment-page-1/#comment-90</link>
		<dc:creator>FractalizeR</dc:creator>
		<pubDate>Sat, 13 Nov 2010 19:30:52 +0000</pubDate>
		<guid isPermaLink="false">http://ru.fractalizer.ru/?p=154#comment-90</guid>
		<description>&lt;blockquote&gt;Для использования делегированного метода вообще не нужно никакого наследования&lt;/blockquote&gt;
В каком-то смысле вы правы. Просто я рассматривал ситуацию на примере именно добавления поведения к готовым классам. Я прокомментировал этот момент в статье.

&lt;blockquote&gt;вот это лучше убрать с хабра. Если уж и думать о том, что нужно делать в жизни, то явно не на примере программирования и холиваров.&lt;/blockquote&gt;
Ваша аргументация показалась мне слабой в этом моменте. Думаю, я все же оставлю этот кусок, хотя, кому-то он может показаться несколько напыщенным, наверное?

&lt;blockquote&gt;Вы вообще понимаете, о чём пишете?&lt;/blockquote&gt;
Я буду благодарен, если вы докажете мне, что я неправ. Можете изложить, как в случае с делегированием проблема добавления функционала в ORM сторонними разработчиками из моего примера будет решаться легко и просто?

&lt;blockquote&gt;Примеси это разрушение инкапсуляции,&lt;/blockquote&gt;
Не примеси - нарушение инкапсуляции, а возможность примеси изменять защищенные поля агрегата. Не обобщайте. Примеси - альтернативный механизм реализации множественного наследования, имеющий свои преимущества и недостатки.

Спасибо за комментарий.</description>
		<content:encoded><![CDATA[<blockquote><p>Для использования делегированного метода вообще не нужно никакого наследования</p></blockquote>
<p>В каком-то смысле вы правы. Просто я рассматривал ситуацию на примере именно добавления поведения к готовым классам. Я прокомментировал этот момент в статье.</p>
<blockquote><p>вот это лучше убрать с хабра. Если уж и думать о том, что нужно делать в жизни, то явно не на примере программирования и холиваров.</p></blockquote>
<p>Ваша аргументация показалась мне слабой в этом моменте. Думаю, я все же оставлю этот кусок, хотя, кому-то он может показаться несколько напыщенным, наверное?</p>
<blockquote><p>Вы вообще понимаете, о чём пишете?</p></blockquote>
<p>Я буду благодарен, если вы докажете мне, что я неправ. Можете изложить, как в случае с делегированием проблема добавления функционала в ORM сторонними разработчиками из моего примера будет решаться легко и просто?</p>
<blockquote><p>Примеси это разрушение инкапсуляции,</p></blockquote>
<p>Не примеси &#8211; нарушение инкапсуляции, а возможность примеси изменять защищенные поля агрегата. Не обобщайте. Примеси &#8211; альтернативный механизм реализации множественного наследования, имеющий свои преимущества и недостатки.</p>
<p>Спасибо за комментарий.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Комментарий к записи Примеси VS делегирование: преимущества и недостатки при реализации &#171;плагинов&#187; (OZ)</title>
		<link>http://ru.fractalizer.ru/frpost_154/%d0%bf%d1%80%d0%b8%d0%bc%d0%b5%d1%81%d0%b8-vs-%d0%b4%d0%b5%d0%bb%d0%b5%d0%b3%d0%b8%d1%80%d0%be%d0%b2%d0%b0%d0%bd%d0%b8%d0%b5-%d0%bf%d1%80%d0%b5%d0%b8%d0%bc%d1%83%d1%89%d0%b5%d1%81%d1%82%d0%b2%d0%b0/comment-page-1/#comment-89</link>
		<dc:creator>OZ</dc:creator>
		<pubDate>Sat, 13 Nov 2010 19:06:36 +0000</pubDate>
		<guid isPermaLink="false">http://ru.fractalizer.ru/?p=154#comment-89</guid>
		<description>Для использования делегированного метода вообще не нужно никакого наследования. Просто в теле основного класса вызываете ДРУГОЙ класс, передаёте ему параметры и получаете результат. Вот и всё. Даже если вы этот делегируемый метод делаете публичными и вам приходится его декорировать - это не требует наследования.

&quot;Помните, что любой выбор в жизни всегда нужно делать, руководствуясь двумя вещами&quot; - вот это лучше убрать с хабра. Если уж и думать о том, что нужно делать в жизни, то явно не на примере программирования и холиваров.

&quot;не «вместо», а «вместе»! Как это можно реализовать? В случае примесей все по-прежнему просто.&quot; - Вы вообще понимаете, о чём пишете? Примеси это разрушение инкапсуляции, и именно разрушение инкапсуляции создаст проблемы при работе разных разработчиков. Если одна сторонняя примесь будет куролесить с внутренними свойствами и методами - это ещё терпимо, но если все &quot;плагины&quot; - это будет хаос.

Я советую вам убрать статью на хабре в черновики - сравнение Ваше никуда не годится. Оно, мягко говоря, предвзято, и это видно в каждой строчке.
&quot;очевидно, вам придется перейти к примесям&quot;
&quot;решение с использованием делегирования будет выглядеть сложновато&quot; (это вообще &quot;сенсационное&quot; заявление - делегирование осуществляется нативно и крайне прозрачно, а примеси - магическими методами в runtime).
После этого про &quot;яростных сторонников одного из подходов&quot; читать было смешно.</description>
		<content:encoded><![CDATA[<p>Для использования делегированного метода вообще не нужно никакого наследования. Просто в теле основного класса вызываете ДРУГОЙ класс, передаёте ему параметры и получаете результат. Вот и всё. Даже если вы этот делегируемый метод делаете публичными и вам приходится его декорировать &#8211; это не требует наследования.</p>
<p>&laquo;Помните, что любой выбор в жизни всегда нужно делать, руководствуясь двумя вещами&raquo; &#8211; вот это лучше убрать с хабра. Если уж и думать о том, что нужно делать в жизни, то явно не на примере программирования и холиваров.</p>
<p>&laquo;не «вместо», а «вместе»! Как это можно реализовать? В случае примесей все по-прежнему просто.&raquo; &#8211; Вы вообще понимаете, о чём пишете? Примеси это разрушение инкапсуляции, и именно разрушение инкапсуляции создаст проблемы при работе разных разработчиков. Если одна сторонняя примесь будет куролесить с внутренними свойствами и методами &#8211; это ещё терпимо, но если все &laquo;плагины&raquo; &#8211; это будет хаос.</p>
<p>Я советую вам убрать статью на хабре в черновики &#8211; сравнение Ваше никуда не годится. Оно, мягко говоря, предвзято, и это видно в каждой строчке.<br />
&laquo;очевидно, вам придется перейти к примесям&raquo;<br />
&laquo;решение с использованием делегирования будет выглядеть сложновато&raquo; (это вообще &laquo;сенсационное&raquo; заявление &#8211; делегирование осуществляется нативно и крайне прозрачно, а примеси &#8211; магическими методами в runtime).<br />
После этого про &laquo;яростных сторонников одного из подходов&raquo; читать было смешно.</p>
]]></content:encoded>
	</item>
</channel>
</rss>

