【问题标题】:PHP: Method Chain with new self()?PHP:带有新 self() 的方法链?
【发布时间】:2013-12-07 14:27:51
【问题描述】:

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

我是这样尝试的,但是$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?,但目前还不太清楚这是否可行。

【问题讨论】:

    标签: php oop methods chaining


    【解决方案1】:

    two 是一个静态方法。您正在尝试在实例上调用它,而静态方法根据定义不适用于特定实例。

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

    【讨论】:

    • 谢谢你的解释,希望我能接受两个答案:D
    • 我得到 15 次重复后会做 :D
    【解决方案2】:

    如果我没有误解您要做什么,如果您不将第二个方法设为静态,您可以返回一个对象,它会在链式调用中作为 $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();
    

    【讨论】:

    • 太好了,这正是我想要的!谢谢!第二个静态函数是错误的,我只是复制了第一个方法,不小心忘记了(我更正了)。我不知道我可以在链式调用中将 $obj 称为 $this。
    【解决方案3】:

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

    p.s 请注意,方法链接可以让您有更多机会处理诸如 PHP 致命错误之类的错误:调用成员函数 .... on a non-object in .... 当混合更多类并返回时

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

    【讨论】:

    • “方法链只有在你使用 setter 时才有意义”不是真的。
    • 非常感谢您提供此示例,但我专门寻找 Joachim 和 meagar 解释的内容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-12
    • 1970-01-01
    • 2011-03-29
    • 2016-01-18
    • 1970-01-01
    • 1970-01-01
    • 2013-09-11
    相关资源
    最近更新 更多