在PHP中链接新对象实例

在PHP中链接新对象实例,php,Php,我们有以下链接: $obj = new obj(); $obj->setname($params1)->setcolor($params2); 有没有一种方法可以在一行上进行相同的链接,而不创建虚拟函数 我想跳过构造器本身在新行的部分。我想构造对象并在同一条线上开始链接。大概是这样的: $obj = new obj()->setname($params1)->setcolor($params2); $obj = (new obj())->setname($par

我们有以下链接:

$obj = new obj();
$obj->setname($params1)->setcolor($params2);
有没有一种方法可以在一行上进行相同的链接,而不创建虚拟函数


我想跳过构造器本身在新行的部分。我想构造对象并在同一条线上开始链接。大概是这样的:

$obj = new obj()->setname($params1)->setcolor($params2);
$obj = (new obj())->setname($params1)->setcolor($params2);
function _i($i) { return $i; }
_i(new Obj)->doThis($param)->doThat($param2);

如果始终在函数中返回对象本身,则应该是可能的

function setname($param) {
    // set the name etc..
    return $this;
}

当然是。simpt
在每个函数的末尾返回此
,以返回对象,以便下一个链接函数可以使用它

<?php
    class A
    {
        public __constructor()
        { .... }

        public function B($params)
        {
            //Processing
            return this;
        }

        public function C($params)
        {
            //Processing
            return this;
        }

        public function D($params)
        {
            //Processing
        }
    }
    $O = new A();
    $O->B($params)->C($params)->D($params); //Will work because B and C return this
    $O->B($params)->D($params)->C($params); //WILL NOT work because D doesn't return this
?>

自PHP 5.4以来,已添加实例化时的类成员访问权限,因此您可以这样做:

$obj = new obj()->setname($params1)->setcolor($params2);
$obj = (new obj())->setname($params1)->setcolor($params2);
function _i($i) { return $i; }
_i(new Obj)->doThis($param)->doThat($param2);
在以前的版本中,像您一样,我讨厌您必须在一行上实例化对象,然后在另一行上开始使用它,因此我有一个全局函数
\u I()
,如下所示:

$obj = new obj()->setname($params1)->setcolor($params2);
$obj = (new obj())->setname($params1)->setcolor($params2);
function _i($i) { return $i; }
_i(new Obj)->doThis($param)->doThat($param2);
我是这样使用它的:

$obj = new obj()->setname($params1)->setcolor($params2);
$obj = (new obj())->setname($params1)->setcolor($params2);
function _i($i) { return $i; }
_i(new Obj)->doThis($param)->doThat($param2);

有些人会觉得它很难看,但PHP缺乏语言表达能力,所以它适合我:)

我使用类的静态函数


class a{
    static public function gets($args){
         return new self($args);
    }
    public function do_other(){

    }
}

a::gets()->do_other();
通常有更多的静态方法用于不同的用途

您也可以使用它来确保只有正确的对象被用作参数

function instance(sdtClass $instance) { return $instance }
或者作为使用类名的静态方法

class CustomClass{
    static public function gets(CustomClass $obj){
        return $obj;
    }

}

您还可以从Singleton模式使用此技术(不使用Singleton模式):


我已经完成了。我想把这两行合并成一行:{new obj()}->setname($params1)->setcolor($params2);但是我不知道怎么做。我相信你也可以在构造函数的末尾做
返回这个
,来达到这个效果。我的PHP已经生锈了,它的工作原理就是这样。也许你在别的地方出错了?收到错误消息了吗?我想跳过构造器本身位于新行的部分。我想构造对象并在同一行上开始链接。请检查我对daddz的注释回答:)将函数添加到类本身:静态函数实例(){return new obj();}obj::instance()->chain()。。。现在一切正常