PHP:带有新self()的方法链?

时间:2013-12-07 14:27:52

标签: php oop methods chaining

我在一个方法中创建了一个对象,我想在同一个类的另一个方法中进一步处理它。

我试过这样,但$ obj没有传递给方法二():

class SomeClass {
    public static function one($id)
    {
        $obj = new self();
        $obj->id = $id;
        //...
        return $obj;
    }

    public function two()
    {
        $obj->id = 2;
        return $obj;
    }
}

$obj = SomeClass::one($id)->two();

有没有办法实现这个目标?

我找到了这个帖子How to chain method on a newly created object?,但目前还不是很清楚这是否可行。

3 个答案:

答案 0 :(得分:2)

two是一种静态方法。您试图在实例上调用它,并且根据定义静态方法不适用于特定实例。

使方法静态,并操纵$this而不是$obj

答案 1 :(得分:1)

如果我没有误解你正在尝试做什么,如果你没有使第二个方法静态,你可以返回一个对象,它将在链接的调用中以$ this传入;

class SomeClass {

    public $id = 0;

    public static function one($id)
    {
        $obj = new self();  // Create and return new object
        $obj->id = $id;
        return $obj;
    }

    public function two()
    {
        $this->id = 3;      // The new object is $this here
        return $this;
    }
}

$obj = SomeClass::one(5)->two();

答案 2 :(得分:0)

方法链接只在使用setter时才有意义。 结合PHPDoc,大多数IDE(如NetBeans)将再次支持代码完成/自动完成功能。

ps请注意,方法链接可以让您更多机会出现错误,例如PHP致命错误:调用成员函数....在非对象中...当混合更多类时返回< /强>

class Example {

    protected $var = null;


    public function __construct() {

    }

    public function __destruct() {
        unset($this->var); // explicit memory clearing 
    }

    /**
     * @return \Example
     */
    public static function create() {
        return new self();
    }

    /**
     * @return \Example
     */    
    public static function getInstance() {
        return self::create();
    }

    /**
     * @return \Example
     */    
    public static function newInstance() {
        return self::create();
    }


    /**
     * 
     * @param mixed $var
     * @return \Example
     */
    public function setThing1($var) {
        $this->var = $var;
        return $this;
    }

    /**
     * 
     * @param mixed $var
     * @return \Example
     */
    public function setThing2($var) {
        $this->var = $var;
        return $this;
    }    
}

Example::create()->setThing1(1)->setThing2('2');