2015-03-24 2 views
0

У меня есть следующий класс в PHP со всеми статическими методами:PHP класс со статическими методами перед крючком

class Foo { 
    public static function a { 
    } 

    public static function b { 
    } 

    public static function c { 
    } 

    public static function d { 
    } 

    public static function e { 
    } 
} 

Есть ли способ, чтобы создать крюк, чтобы стрелять перед вызовом любого из методов в классе Foo т.е. как до крючка? Мне нужна какая-то логика, и не хочет, чтобы добавить эту логику к каждой статической функции, как:

class Foo { 
    private static function init() { 
     // pre logic here 
    } 

    public static function a { 
     Foo::init(); 
    } 

    public static function b { 
     Foo::init(); 
    } 

    public static function c { 
     Foo::init(); 
    } 

    public static function d { 
     Foo::init(); 
    } 

    public static function e { 
     Foo::init(); 
    } 
} 
+0

Этот ответ имеет некоторые интересные идеи: http://stackoverflow.com/questions/5368199/best-practices-for -static-constructors –

ответ

3

Что вы хотите назвать Aspect-Oriented Programming. Это позволяет определить совет до вызова метода, доступа к свойствам, инициализации класса и т. Д.

Однако эта методика не очень широко используется в PHP из-за ее сложности. Я могу предложить вам пример с Go! AOP Framework.

class AutoInitializationAspect implements Aspect 
{ 

    /** 
    * This advice intercepts an execution of static methods 
    * 
    * We use "Before" type of advice to initialize the state 
    * 
    * @param MethodInvocation $invocation Invocation 
    * 
    * @Before("execution(public Foo::*(*))", scope="target") 
    */ 
    public function beforeMethodExecution(MethodInvocation $invocation) 
    { 
     $class = $invocation->getThis(); // will be the class name 
     $class::init(); // access to the private scope of class 
    } 
} 

Посетите http://demo.aopphp.com/?showcase=loggable для демонстрации (см LoggingDemo :: runByName() статический метод перехвачен)

0

Я думаю, вы можете использовать __callStatic() магический метод для достижения.

public static function __callStatic($name, $arguments) 
{ 
    // pre logic here 
    switch($name) 
    { 
     case 'a': 
     // do something 
     break; 

     case 'b': 
     // do something 
     break; 
    } 
} 
+1

Я думал, что '__callStatic()' ТОЛЬКО называется, где нет статического соответствующего метода, определенного в классе. – Justin

+0

извините :) Спасибо, что преподал мне :) –

0

Основной ответ: нет, такого простого в PHP нет.

Однако, вы можете попробовать несколько вариантов:

  1. Вы можете назвать ваши методы, как aSomeSuffix, bSomeSuffix и т.д., и вызвать их с помощью __callStatic метода вычислений, суффиксом имя на лету.
    Плюсы:

    • один обработчик

    Минусов:

    • Вашего IDE не будет видеть эти методы, пока вы явно не записывать их с помощью PHPDoc
    • Дополнительных работ и большой кучи мест для совершения ошибки (аргументы, передаваемые по ссылке, отсутствие обработки метода и т. д.)
  2. Вы можете попробовать Go библиотека, которая вводит аспектно-ориентированное программирование в PHP, утверждает, что сможет перехватывать статические вызовы. Я никогда не использовал его (хотя я слышал много хороших отзывов об этом) и ничего не знаю о снижении производительности и/или оговорках, использующих его, но, похоже, это соответствует вашему делу. Я думаю, это все равно потребует написать аннотацию для каждого метода, но это приведет к одиночному обработчику.

  3. Метод инициализации вызова в каждом методе. Это то, чего вы пытаетесь избежать, а не вариант, я думаю, только потому, что он нарушает DRY.

Смежные вопросы