【问题标题】:PHP: Chaining Method Calls [duplicate]PHP:链接方法调用[重复]
【发布时间】:2012-03-11 06:23:47
【问题描述】:

可能重复:
PHP method chaining?

我偶尔会看到一些 php 应用程序使用这样的类:

$Obj = new Obj();
$Obj->selectFile('datafile.ext')->getDATA();

上面的示例获取所选文件的内容然后返回它们(只是一个示例);

好吧,在我决定问你我该怎么做之前,我试过这个:

class Someclass {
    public function selectFile( $filename  ) { 
       $callAclass = new AnotherClass( $filename );
       return $callAclass;
    }

    // Other functions ...
}

class AnotherClass {
    protected $file_name;

    public function __construct ( $filename ) { $this->file_name = $filename; }
    public function getDATA ( ) {
        $data = file_get_contents( $this->file_name );
        return $data;

    } 

    // funcs , funcs, funcs ....

}

这是完成这项任务的正确方法吗?请告诉我这些类叫什么。

【问题讨论】:

  • 谷歌搜索method chaining in php。基本上你只是在链式方法中返回$this :) 虽然这个例子只是误导,选择文件可能只是一个factory 来根据上下文(在这个名称文件名中)生成另一个对象。所以如果方法返回任何类型的 Object 你可以链接它。
  • 请避免在堆栈溢出时使用表情符号、网络俚语和粗体文本。还要记得阅读FAQ
  • 我喜欢火车残骸这个词。

标签: php oop class object method-chaining


【解决方案1】:

这叫做方法链。看看这个question SO。

您可以通过以下方式实现您想要实现的目标:

class File 
{
    protected $_fileName;

    public function selectFile($filename) 
    { 
        $this->_fileName = $filename; 
        return $this;
    }

    public function getData()
    {
        return file_get_contents($this->_fileName);
    }
}


$file = new File();
echo $file->selectFile('hello.txt')->getData();

请注意,我们在 selectFile 中返回 $this,这使我们能够将另一个方法链接到它。

【讨论】:

  • 所以我应该只返回 Object 本身!非常感谢 !你真大方! 祝福你:)
【解决方案2】:

上面的例子(第一个)叫做链接。这是一堂普通的课:

class a_class
{

    public function method_a()
    {
        echo 'method a';
    }

    public function method_b()
    {
        echo ' - method b';
    }

}

你会这样称呼他们:

$class = new a_class();

$class->method_a();
$class->method_b();

这将回显“方法 a - 方法 b”。现在要链接它们,您将在方法中返回对象:

class a_class
{

    public function method_a()
    {
        echo 'method a';
        return $this;
    }

    public function method_b()
    {
        echo ' - method b';
        return $this;
    }

}

你会这样称呼他们:

$class = new a_class();

$class->method_a()->method_b();

这也会回显“方法 a - 方法 b”。

虽然我在最后一个方法中返回了对象 - 你完全不需要,只有前面的方法需要链接。

【讨论】:

  • 所以关键是返回对象本身!非常感谢!
猜你喜欢
  • 2014-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-04
  • 1970-01-01
  • 1970-01-01
  • 2015-06-20
  • 2017-01-21
相关资源
最近更新 更多