Kri*_*ard 315
它非常简单,你有一系列mutator方法都返回原始(或其他)对象,这样你就可以继续调用返回对象的方法.
<?php
class fakeString
{
private $str;
function __construct()
{
$this->str = "";
}
function addA()
{
$this->str .= "a";
return $this;
}
function addB()
{
$this->str .= "b";
return $this;
}
function getStr()
{
return $this->str;
}
}
$a = new fakeString();
echo $a->addA()->addB()->getStr();
Run Code Online (Sandbox Code Playgroud)
输出"ab"
Bol*_*ock 43
基本上,你拿一个对象:
$obj = new ObjectWithChainableMethods();
Run Code Online (Sandbox Code Playgroud)
调用return $this;
最终有效执行的方法:
$obj->doSomething();
Run Code Online (Sandbox Code Playgroud)
由于它返回相同的对象,或者更确切地说是对同一对象的引用,因此可以继续从返回值中调用同一类的方法,如下所示:
$obj->doSomething()->doSomethingElse();
Run Code Online (Sandbox Code Playgroud)
就是这样,真的.两件重要的事情:
如你所知,它只是PHP 5.它在PHP 4中无法正常工作,因为它按值返回对象,这意味着您在对象的不同副本上调用方法,这会破坏您的代码.
同样,您需要在可链接方法中返回对象:
public function doSomething() {
// Do stuff
return $this;
}
public function doSomethingElse() {
// Do more stuff
return $this;
}
Run Code Online (Sandbox Code Playgroud)mwa*_*ben 24
试试这段代码:
<?php
class DBManager
{
private $selectables = array();
private $table;
private $whereClause;
private $limit;
public function select() {
$this->selectables = func_get_args();
return $this;
}
public function from($table) {
$this->table = $table;
return $this;
}
public function where($where) {
$this->whereClause = $where;
return $this;
}
public function limit($limit) {
$this->limit = $limit;
return $this;
}
public function result() {
$query[] = "SELECT";
// if the selectables array is empty, select all
if (empty($this->selectables)) {
$query[] = "*";
}
// else select according to selectables
else {
$query[] = join(', ', $this->selectables);
}
$query[] = "FROM";
$query[] = $this->table;
if (!empty($this->whereClause)) {
$query[] = "WHERE";
$query[] = $this->whereClause;
}
if (!empty($this->limit)) {
$query[] = "LIMIT";
$query[] = $this->limit;
}
return join(' ', $query);
}
}
// Now to use the class and see how METHOD CHAINING works
// let us instantiate the class DBManager
$testOne = new DBManager();
$testOne->select()->from('users');
echo $testOne->result();
// OR
echo $testOne->select()->from('users')->result();
// both displays: 'SELECT * FROM users'
$testTwo = new DBManager();
$testTwo->select()->from('posts')->where('id > 200')->limit(10);
echo $testTwo->result();
// this displays: 'SELECT * FROM posts WHERE id > 200 LIMIT 10'
$testThree = new DBManager();
$testThree->select(
'firstname',
'email',
'country',
'city'
)->from('users')->where('id = 2399');
echo $testThree->result();
// this will display:
// 'SELECT firstname, email, country, city FROM users WHERE id = 2399'
?>
Run Code Online (Sandbox Code Playgroud)
ale*_*exn 11
方法链接意味着您可以链接方法调用:
$object->method1()->method2()->method3()
Run Code Online (Sandbox Code Playgroud)
这意味着method1()需要返回一个对象,而method2()则给出了method1()的结果.然后,Method2()将返回值传递给method3().
好文章:http://www.talkphp.com/advanced-php-programming/1163-php5-method-chaining.html
class Maker
{
private static $result = null;
private static $delimiter = '.';
private static $data = [];
public static function words($words)
{
if( !empty($words) && count($words) )
{
foreach ($words as $w)
{
self::$data[] = $w;
}
}
return new static;
}
public static function concate($delimiter)
{
self::$delimiter = $delimiter;
foreach (self::$data as $d)
{
self::$result .= $d.$delimiter;
}
return new static;
}
public static function get()
{
return rtrim(self::$result, self::$delimiter);
}
}
Run Code Online (Sandbox Code Playgroud)
echo Maker::words(['foo', 'bob', 'bar'])->concate('-')->get();
echo "<br />";
echo Maker::words(['foo', 'bob', 'bar'])->concate('>')->get();
Run Code Online (Sandbox Code Playgroud)
小智 6
有49行代码允许您将方法链接到数组,如下所示:
$fruits = new Arr(array("lemon", "orange", "banana", "apple"));
$fruits->change_key_case(CASE_UPPER)->filter()->walk(function($value,$key) {
echo $key.': '.$value."\r\n";
});
Run Code Online (Sandbox Code Playgroud)
请参阅本文,其中介绍了如何链接所有PHP的70个array_函数.
http://domexception.blogspot.fi/2013/08/php-magic-methods-and-arrayobject.html