PHP5中的链接方法

时间:2011-08-11 21:40:48

标签: php oop

好的,伙计们。这是我一直在考虑的事情:

由于可以在PHP5中链接方法,我想知道是否有可能通过智能方式进一步理解一个方法是否是要执行的链中的最后一个方法 - 并且没有使用第三种方法名为getResult()

普通方法调用:

$myClass->dofirst(); // Data is returned from the dofirst-method

我想要的是什么;

$myclass->dofirst()->sortOutputfromDofirstAndReturn();

这个想法是第二种方法sortOutputfromDofirstAndReturn()会阻止dofirst()方法返回,而是执行第二种方法中所述的逻辑,而不需要第三种方法将返回值反弹到用户。

也许有点混乱,所以如果我需要澄清任何事情,请告诉我!

7 个答案:

答案 0 :(得分:1)

如果我正确理解了这个问题,那么这将有效。我一直称这是一个流畅的界面,但我不知道这是否是正确的名称。基本上它是通过在每个方法的末尾返回它来工作,如下例所示。

class Foo {
    public function doFirst() {
        $this->bar = array('b', 'c', 'a');
        return $this;
    }

    public function sortOutputfromDofirstAndReturn() {
        sort($this->bar);
        return $this;
    }

}

答案 1 :(得分:1)

方法调用按顺序执行,您必须返回一个对象,以便可以在其上调用方法。如果dofirst()返回普通数据,则无法进行此操作。

答案 2 :(得分:1)

我认为只有数据是字符串才能使用魔术方法

class MyClass{
  public function __toString(){
    return $this->data;
  }
  public function dofirst(){
    $this->data='Hello';
    return $this;
  }
  public function sort(){
    $this->data.=' World';
    return $this;
  }    
}

$obj = new MyClass;
echo $obj->dofirst(); //Hello
echo $obj->dofirst()->sort(); //Hello world

答案 3 :(得分:0)

doFirst() 必须返回某些内容(特别是对象)才有资格进行链接。 sortOutputfromDofirstAndReturn()将对doFirst()返回的对象进行操作,因此doFirst()应该像这样返回:

public function doFirst() {
     // snip
     return $this;
}

因此,最后一个方法(在这种情况下为sortOutputfromDofirstAndReturn())不能也不应该阻止链中的早期方法返回。但是,开发人员应该确保这些早期方法返回一个对象(而不是输出或其他数据)。

答案 4 :(得分:0)

你基本上都在询问是否可以将前一个方法将其数据传递给下一个方法而不“返回”的方法。鉴于您只链接对象上的方法,并且除了调用的最后一个方法之外没有捕获任何返回值(如果您正在链接应该只返回对已有对象的另一个引用),那么它已经这样做了。如果dofirst()返回一些永远不会被看到的值,那真的无关紧要。这里没有性能增强。

修改

我认为你误解了你的问题,因为你表示你理解方法链。你要问的只是返回它们所属对象的函数。当您致电$myclass->dofirst()时,您只需从dofirst对象调用$myclass函数即可。如果要将方法链接到此,则需要dofirst再次返回该对象,以便可以在其上调用另一个函数。

class MyClass{

    function dofirst()
    {
        // do something
        return $this; // return the object you were calling this function on
    }
}

如果您现在查看代码的执行方式,$myclass->dofirst()会返回$myclass的引用,然后您将在链中调用sortOutputfromDofirstAndReturn()$myclass->dofirst()->sortOutputfromDofirstAndReturn();

查看工厂模式以查看方法链接被大量使用的示例。

答案 5 :(得分:0)

我不是100%肯定你在问什么;如果你想让第二个“排序”函数对doFirst的输出做一些事情,你为什么不用它?

$myclass->sortOutputfromDofirstAndReturn(dofirst());

让doFirst()返回一些东西?正如其他人所说,doFirst必须返回$this或对象才能正常工作。如果我正确阅读你只想使用方法2来操作方法1应该返回的东西。

答案 6 :(得分:0)

几乎没有可能:

添加完成链的一个(或几个特殊的)方法(参见Doctrien 1.2)(execute是特殊的)

$q = new Doctrine_Query();
$q->select('Foo')->where('bar = 1')->orderBy('bar')->execute();

如果最终结果总是像对象一样,那么你可以用你的链逻辑实现Iterator接口。

class Chain implements Iterator { /* implementation */ }
$c = new Chain();
foreach ($c->first()->second() as $item) { /* do stuff */ }

半傻瓜。如果您的结果是字符串,则重新实现__toString方法......