Php 如何通过编程更改每个方法以返回$this(预定义列表除外)?

Php 如何通过编程更改每个方法以返回$this(预定义列表除外)?,php,php-5.2,Php,Php 5.2,我有一门课: 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...) {

我有一门课:

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();

在某些情况下,我使用此基类:

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设计的。
也许您可以在特定的问题域上进行一些扩展。

如果您不想在每个方法中添加一行返回$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());
类模块{
私有函数_a($value){
echo“执行方法a
”; $this->aVar=$value; } 私有函数(值){ echo“执行方法b
”; $this->bVar=$value; } 私有函数c($value){ 回显“执行方法c
”; $this->cVar=$value; } 公共函数getAsArray(){ 返回get\u object\u vars($this); } 公共函数调用($name,$arguments){ 回显“调用方法”。$name.
; 调用_user_func_数组(数组($this,“'.$name),$arguments); 退还$this; } } $x=新模块(); 变量转储($x->a(1)->b(2)->c(3)->getAsArray());
虽然这确实比你不喜欢的一行改变要多

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


您可以手工操作,也可以编写一个程序来浏览源文件并为您操作。

我就是这么想的,但这需要在每个方法定义中添加前缀。这比在每个方法中添加
return$this
要好,但仍然很痛苦。它不是一行,继承类中的每个方法都必须返回
$this
,我不想在那里写它。有什么特别的原因不想在每个方法中写一个返回$this吗?这是不必要的代码冗余。如果我不需要,为什么我要写它呢?虽然这不是代码冗余。PHP中任何方法的默认行为都是返回NULL:选择返回任何其他值(包括$this)是必要的,额外的代码。这是必要的,额外的代码,我不希望在一个单独的位置,而不是在每个函数中都有。我不想把它作为一个分支课程。