2015-03-02 26 views
3

设计问题/ PHP: 我有一个包含方法的类。 我想在任何时候调用类中的任何方法时调用外部函数。 我想使它具有通用性,所以无论何时添加其他方法,流程都可以使用此方法。在方法调用之前调用函数

简单的例子:

<?php 

function foo() 
{ 
    return true; 
} 

class ABC { 
    public function a() 
    { 
     echo 'a'; 
    } 
    public function b() 
    { 
     echo 'b'; 
    } 
} 

?> 

我要打电话给foo()上()或b()之前的任何时间被调用。

我该如何做到这一点?

+0

任何必要的。它似乎像'class'中的'构造函数' – Ranjith 2015-03-02 10:08:01

+0

使用带有钩子的装饰器模式来调用'__call'和'__callStatic'来拦截任何方法调用并执行你的函数。 – didierc 2015-03-02 10:11:51

+0

@didierc你可以在这里粘贴一个sudo代码,因为对于像我这样的许多初学者来说这是不可理解的。 – 2015-03-02 10:24:11

回答

1

您需要使用__invoke()方法类

class ABC { 
    public function __invoke() 
    { 
     //Call your external function here 
    } 
    public function a() 
    { 
     echo 'a'; 
    } 
    public function b() 
    { 
     echo 'b'; 
    } 
} 

的供您参考:

+3

'__invoke()'仅在对象被用作函数时被调用(参见['is_callable'](http://php.net/manual/en/function.is-callable.php))。例如:'$ x = new ABC(); $ X();'。这在这里没有帮助。 – axiac 2015-03-02 10:43:15

+0

@axiac感谢您的信息。 upvoted你的评论! – 2015-03-02 12:22:26

5

保护您的方法,以便他们不是从类的外部直接访问,然后用魔法__call()方法来控制对它们的访问,并在调用你的foo后执行它们()

function foo() 
{ 
    echo 'In pre-execute hook', PHP_EOL; 
    return true; 
} 

class ABC { 
    private function a() 
    { 
     echo 'a', PHP_EOL; 
    } 
    private function b($myarg) 
    { 
     echo $myarg, ' b', PHP_EOL; 
    } 

    public function __call($method, $args) { 
     if(!method_exists($this, $method)) { 
      throw new Exception("Method doesn't exist"); 
     } 
     call_user_func('foo'); 
     call_user_func_array([$this, $method], $args); 
    } 
} 

$test = new ABC(); 
$test->a(); 
$test->b('Hello'); 
$test->c(); 
相关问题