可能重复:
PHP方法链接?
我对PHP和OOP比较陌生,而且我无法理解在我的数据库代码中弹出的重复结构.
我理解如何创建一个类,实例化它,以及访问属性和方法,但$myobject->function()它现在和我一样复杂.
这个结构是什么?
$myobject->function()->something.我越来越多地看到这一点,特别是当我开始围绕mysql PDO查询.例如:
$query->function1($arg)
->function2($arg)
->function3($arg);
Run Code Online (Sandbox Code Playgroud)
这里发生了什么事?它是简单地在类中链接多个方法的一个调用,还是那些子函数function1()?类定义会是什么样的?
这是一种名为Fluent Interface的设计模式.它通过一些使用它的着名框架(例如jQuery)而变得普及.这是编写紧凑,可读代码(在某些情况下)的巧妙技巧,但与许多设计模式一样,它并不适合所有情况.
该->符号实际上只是一个运算符.类似的方式+或-可用于对数字操作,该->操作员可以在对象和成员操作.PHP解释器可以简化表达式,如同5 + 4简单9,它也可以简化表达式$a->b.$a->b通过在内部$a查找名为的成员来评估表达式b.
就像+操作符可以在表达式中多次使用一样,例如5 + 2 + 7,->操作符也可以多次使用.PHP解释器对于+运算符是左关联的,这意味着它的计算结果5 + 2 + 7好像是编写的(5 + 2) + 7,它的计算结果为7 + 7,而后者的计算结果为14.
该->运营商还剩下关联.所以类似的表达式$a->b->c以与前一个例子类似的方式解释:首先,解释器$a->b通过查找一个名为bin 的成员进行求值a,然后它查找一个名为的成员c!这假定$a->b实际评估对象; 如果没有,那么PHP解释器会给你一个错误:"试图获得非对象的属性".
这种范式可以无限延长:$a->b->c->d->e->f->g->....等等
在Fluent Interface设计模式中,这是通过让所有实例方法返回实例来实现的.所以$a->b()回报$a.因此,$a->b()->c()与调用$a->b()然后调用完全相同$a->c().
有些人认为前者比后者更具可读性.在某些情况下这是真的,但在其他情况下则不然.像大多数设计模式一样,在决定是否使用此模式时,您需要使用良好的判断.请记住,只有实例方法纯粹因其副作用而被调用时,此模式才有效.除了实例本身之外,您不能从实例方法返回任何其他值,否则您将破坏流畅的界面.