调用现有方法时执行(魔术)方法

时间:2012-04-06 18:19:36

标签: php

是否存在一种魔术方法,当从对象调用某个方法时,首先调用一个魔术方法。有点像__call方法,但只有在找不到方法时才会触发。

所以在我的情况下,我喜欢这样的事情:

class MyClass
{
    public function __startMethod ( $method, $args )
    {
        // a method just got called, so  this is called first
        echo ' [start] ';
    }

    public function helloWorld ( )
    {
        echo ' [Hello] ';
    }
}

$obj = new MyClass();
$obj->helloWorld();

//Output:
[start] [Hello] 

PHP中是否存在类似的内容?

3 个答案:

答案 0 :(得分:4)

没有直接的方法可以做到这一点,但在我看来,你试图实现一种面向方面的编程。有几种方法可以在PHP中实现这一点,一种方法是设置类如下所示:

class MyClass
{
    public function __startMethod ( $method, $args )
    {
        // a method just got called, so  this is called first
        echo ' [start] ';
    }

    public function _helloWorld ( )
    {
        echo ' [Hello] ';
    }

    public function __call($method, $args)
    {
        _startMethod($method, $args);
        $actualMethod = '_'.$method;
        call_user_func_array(array($this, $actualMethod), $args);
    }
}

$obj = new MyClass();
$obj->helloWorld();

查找在PHP中实现AOP的其他方法,看看什么最适合你(我会看看我是否可以在某处找到链接)。

编辑:这是给你的文件http://www.liacs.nl/assets/Bachelorscripties/07-MFAPouw.pdf

答案 1 :(得分:2)

没有没有神奇的方法。

您可以做的最好的事情是为您的函数创建其他名称(例如:hidden_helloWorld),然后使用__call捕获所有调用,并尝试调用{{ 1}}方法,如果它可用。当然,只有完全控制类及其父级的命名等,才有可能实现这一点......

答案 2 :(得分:1)

你可以通过使你的方法私有并使用__call()魔术方法调用方法来实现它。像:

<?php

class MyClass{
    function __call($methd, $args){
        if(method_exists($this, $mthd)){
            $this->$mthd($args);
        }
    }

    private function mthdRequired($args){
        //do something or return something
    }

除了使用call之外,mthdRequired方法不会被调用。我希望这很有用。