2

我正在尝试get_called_class()在父类上使用,并检索父类名称而不是子类名称。在这种情况下我不能使用它,因为我需要在动态上下文中使用它,因为这些方法实际上是使用and__CLASS__插入到现有类中的。Closure::bind__call

快速示例:

<?php 
    class Test {
        function doSomething() {
            echo(get_called_class() . ",");
        }
    }

    class TestSuper extends Test {
        function doSomething() {
            echo(get_called_class() . ",");
            parent::doSomething();
        }
    }

    $test = new TestSuper();
    $test->doSomething();
?>

此示例打印TestSuper,TestSuper,,但我想要get_called_class()动态获取方法所在的类(打印TestSuper,Test,)而不是被调用的类。它还必须在魔法__call方法中起作用。这可能吗?

更新:更好的例子更接近地反映了我正在做的事情:我有一个方法列表,我想在运行时(在$addons变量中)应用到实例(或类):

<?php
    $addons = array(
        "A" => array(
            "doSomething" => function () { return 10; }
        ),
        "B" => array(
            "doSomething" => function () { return parent::doSomething() + 1; }
        )
    );

    class A {
        private $methods = array();

        function __construct() {
            global $addons;

            $class = get_class($this);

            do {
                foreach ($addons[$class] as $name => $method) {
                    $this->methods[$class][$name] = Closure::bind($method, $this, $class);
                }

                $class = get_parent_class($class);
            } while ($class !== false);
        }

        function __call($name, $arguments) {
            $class = get_class($this); // Or something else...

            do {
                if (isset($this->methods[$class][$name])) {
                    return call_user_func_array($this->methods[$class][$name], $arguments);
                }

                $class = get_parent_class($class);
            } while ($class !== false);
        }
    }

    class B extends A {

    }

    $b = new B();
    echo($b->doSomething() . "\n");
?>

我正在向 中添加一个方法doSomethingA并在其上覆盖它B,但我想在那里调用parent::doSomething()将执行AdoSomething. 不幸的是,在执行父方法时,我无法找到一种方法来知道我想A改用 run 的方法,所以它总是runB并最终用完堆栈帧。我如何知道在内部__call方法中执行超类方法?

4

1 回答 1

1

您可以__CLASS____call().
在闭包中,只需使用get_called_class.

<?php 
    class Test {
        public function a() {
            echo(__CLASS__ . ",");
        }
        public function __call($name, array $args) {
            echo(__CLASS__ . ",");
        }
    }

    class TestSuper extends Test {
        public function c() {
            echo(__CLASS__ . ",");
        }
    }

    $test = new TestSuper();

    $d = Closure::bind(
        function () { echo(get_called_class() . ","); },
        $test,
        $test
    );

    $test->a();
    $test->b();
    $test->c();
    $d();
?>

输出:Test,Test,TestSuper,TestSuper,

于 2014-01-23T21:38:02.203 回答