0

我有一堂课:

class Module {

    public function a(...params...) {
        //do something, doesn't return anything
    }

    public function b(...params...) {
        //do something, doesn't return anything
    }

    public function c(...params...) {
        //do something, doesn't return anything
    }

    public function getAsArray() {
        return get_object_vars($this);
    }

}

是否可以修改模块类,所以方法 a()、b() 和 c() 返回 $this?我不想在每个函数中都写它。getAsArray() 应该返回它的作用。模块将是其他类的基础,我希望这种机制在基础中实现,但在继承类中使用它。

我想像这样使用它:

$module = new Module();
$module->a()->b()->c()->getAsArray();
4

3 回答 3

1

如果您不想在每个方法中添加返回 $this 的单行,您可以执行以下操作:

class Module {

    private function _a($value) {
        echo 'Executing method a<br />';
        $this->aVar = $value;
    }

    private function _b($value) {
        echo 'Executing method b<br />';
        $this->bVar = $value;
    }

    private function _c($value) {
        echo 'Executing method c<br />';
        $this->cVar = $value;
    }

    public function getAsArray() {
        return get_object_vars($this);
    }

    public function __call($name, $arguments) {
        echo 'Calling method '.$name.'<br />';
        call_user_func_array(array($this,'_'.$name),$arguments);
        return $this;
    }
}


$x = new Module();

var_dump($x->a(1)->b(2)->c(3)->getAsArray());

尽管这比您似乎不喜欢的单行更改要多做一些工作。

请注意,您不能以任何方式将即时方法调用合并到新的模块行中。这实际上需要您将实例化的对象存储在一个变量中,然后针对该变量链接方法调用。

于 2010-07-16T13:44:30.497 回答
1

不。

您可以手动完成,也可以编写一个程序来检查源文件并为您完成。

于 2010-07-16T13:44:38.983 回答
0

在某些情况下我使用这个基类:

abstract class FluentInterface
{
    public function __call($method, $params)
    {
        if(substr($method, 0, 3) == 'set')
        {
            // remove leading 'set' from method
            $prop = substr($method, 3);
            // lowercase first char
            $prop{0} = strtolower($prop{0});

            $rc = new ReflectionClass(get_class($this));
            if($rc->hasProperty($prop))
            {
                $this->$prop = $params[0];
                return $this;
            }
        }

        return false;
    }
}

但它是专门为 getter/setter 设计的。也许您可以在您的特定问题域上进行一些扩展。

于 2010-07-16T13:37:18.297 回答