7

是否有一种魔术方法,当从对象调用某个方法时,首先调用一个魔术方法。有点像 __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中是否存在类似的东西?

4

3 回答 3

6

没有直接的方法可以做到这一点,但在我看来,您尝试实现一种面向方面的编程形式。在 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

于 2012-04-06T18:35:34.160 回答
2

不,这没有什么神奇的方法。

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

于 2012-04-06T18:31:39.453 回答
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
    }

除了使用调用之外,不会调用 mthdRequired 方法。我希望这是有用的。

于 2015-02-07T15:19:14.527 回答