Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Динамические примеси в PHP

Anna | 31.05.2014 | нет комментариев

Начиная с версии 5.4.0, в PHP появится новая конструкция языка — трейты (traits), реализующая вероятность применения примеси (mix in). Механизм примесей является еще одним механизмом повторного применения кода и присутствует в том либо другом виде в других языках, скажем, Ruby, Python, Common Lisp, etc.

Примеси разрешают применять присутствующий код при реализации поведения классов, чураясь при этом многих задач множественного наследования. Взаимодействующие друг с ином примеси, объединенные в отдельные программные библиотеки, представляют собой дюже сильный инструмент при реализации трудной логики.

Следует подметить, что реализации примесей в PHP существуют как минимум с версии 4.0.1, и в реальное время присутствуют, Почаще каждого под именем behavior, в ряде знаменитых фреймворков, скажем, в Yii, Symfony, Doctrine, CakePhp, Propel.

Цель статьи — продемонстрировать и сравнить несколько основных подходов к реализации примесей в PHP до версии 5.4.0, основывающихся только лишь на функциях самого языка и не использующих сторонние растяжения, как-то, скажем, функцию runkit_method_copy из PECL runkit.

При сопоставлении будут использованы следующие критерии:

  • имеет ли итог микширования тот же тип, что и сам объект
  • может ли одна примесь взаимодействовать с иной
  • дозволено ли проверить, что итог микширования имеет ту либо другую примесь
  • дозволено ли добавить примесь к произвольному классу
  • дозволено ли добавить примесь к теснее сделанному объекту “на лету”
  • насколько примитивна реализация

 

Метод 1-й: Magic methods

Метод основан на идее применения магических способов __call__get, и других: в итог микширования добавляется коллекция примесей, и реализация магических способов выбирает надобную примесь. Всякую примесь дозволено параметризовать ссылкой на итог, поддерживая таким образом взаимодействие примесей друг с ином.

Пример реализации:

abstract class Mixin
{
    protected $mixedObject = null;

    public function setObject( MixedObject $object )
    {
        $this->mixedObject = $object;
    }

    abstract public function getName();
}

class MixedObject
{
    private $mixins = array();

    public function addMixin( Mixin $mixin )
    {
        $mixin->setObject( $this );
        $this->mixins[$mixin->getName()] = $mixin;
    }

    public function hasMixin( $mixinName )
    {
        return array_key_exists( $mixinName, $this->mixins );
    }

    public function __call( $name, $arguments )
    {
        foreach ($this->mixins as $mixin) {
           if (is_callable( array( $mixin, $name ) )) {
               return call_user_func_array( array( $mixin, $name ), $arguments );
           }
        }

       throw new Exception('Unknown method call.');
    }
}

Пример применения:

class Foo extends MixedObject
{
    public function objectFunc()
    {
        return 'FooName';
    }
}

class Debuggable extends Mixin
{
    public function getName()
    {
        return 'Debug';
    }

    public function getDebug()
    {
        return sprintf( "%s", $this->mixedObject->objectFunc() );
    }
}

class Loggable extends Mixin
{
    public function getName()
    {
        return 'Log';
    }

    public function getLog( $level )
    {
        return $this->mixedObject->hasMixin( 'Debug' )
            ? sprintf( "%s %s", $level, $this->mixedObject->getDebug() )
            : sprintf( "%s", $level );
    }
}

$foo = new Foo();
$foo->addMixin( new Debuggable() );
$foo->addMixin( new Loggable() );
print $foo->getDebug();
print $foo->getLog( 'info' );

Очевk!Да Да может ли одна примесь взаимодействовать с иной Да Да дозволено ли проверить, что итог микширования имеет ту либо другую примесь Да Да дозволено ли добавить примесь к произвольному классу Нет Да дозволено ли добавить примесь к теснее сделанному объекту “на лету” Да Нет насколько примитивна реализация Примитивна и очевидна Связана с генерацией кода
То несложно подметить, что недочеты первого метода решаются вторым, равно как и напротив, а также сделать итог касательно области использования того либо другого метода.

1-й является частью дизайна плана, и следственно его область использования – это задачи конструирования трудных бизнес-объектов.

2-й разрешает выделить примеси в отдельные само­стоятельные библиотеки и использовать их в всяких планах, следственно его область использования – легковесные задачи специфичные для целого ряда ваших планов.

Спасибо.

Источник: programmingmaster.ru

Оставить комментарий
БАЗА ЗНАНИЙ
СЛУЧАЙНАЯ СТАТЬЯ
СЛУЧАЙНЫЙ БЛОГ
СЛУЧАЙНЫЙ МОД
СЛУЧАЙНЫЙ СКИН
НОВЫЕ МОДЫ
НОВЫЕ СКИНЫ
НАКОПЛЕННЫЙ ОПЫТ
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB