我不真正了解链接函数如何处理返回的值。
假设我有一个返回字符串或数组的函数
public static $query;
public static function getArray($arr) {
Database::$query = $arr;
return Database::$query;
}
public function single() {
return Database::$query[0];
}
为什么,当我调用它时,然后不能将函数链接到该字符串上以影响字符串(在本示例中,我将附加'test'以及如何进行此操作?
为什么我不能直接打电话
Database::getArray(array("test","test2"))->single();
没有收到Call to a member function single() on array
错误。而是让它仅返回数组的第一个值。
我该如何附加我在这里想要实现的目标?为什么我的逻辑错了?
答案 0 :(得分:3)
调用方法时,返回值就是该方法决定返回的值;返回值与您在其上调用方法的对象没有任何自动关系。例如:
class A {
public function foo() {
return 'Hello, World!';
}
}
$a = new A;
echo $a->foo();
返回的值只是一个普通的字符串,就像foo
是未附加到任何对象的全局函数一样。
在PHP中,字符串(和其他“基本类型”,如数组)不是对象,因此您不能在它们上调用任何方法。即使您可以,这些方法也将内置于该语言中,并且您不能仅仅确定可以在任何数组上调用->single()
。
可能令人困惑的是,有些人使用惯例编写了返回对象的方法,这些方法称为“流畅接口”,或更普遍地称为“链接方法”。这不是语言的功能,只是从方法返回对象的自然结果:
class A {
public function foo() {
return new B;
}
}
class B {
public function bar() {
return 'Hello, World!';
}
}
$a = new A;
$b = $a->foo(); // $b is a B object
echo $b->bar();
// We can combine this into one line:
echo (new A)->foo()->bar();
这种链接没有什么特别的;只要有对象,就可以在对象上调用适当的方法,就像有数字一样,也可以使用它进行数学运算。与简单的添加项进行比较:
function foo() {
return 1;
}
$a = foo();
$a = $a + 2;
echo $a;
// We can combine this into one line:
echo foo() + 2;
// Or keep the assignment:
$a = foo() + 2;
echo $a;
对象不知道它是被链接的-实际上,它不需要了解有关其周围代码的任何信息,这是结构化编程的重要组成部分。
通常的模式是具有修改方法,该方法返回他们刚刚修改的对象,因此您可以一次性进行一系列修改:
class A {
private $words = [];
public function addWord($word) {
$this->words[] = $word;
// $this is the current object, which is an instance of class A
return $this;
}
public function getString() {
return implode(' ', $this->words);
}
}
$a = new A;
// Calling $a->addWord(...) gives us back the same object
$a = $a->addWord('Hello');
$a = $a->addWord('World');
// Calling $a->getString() gives us back a string
echo $a->getString();
// We can combine this into one line:
echo (new A)->addWord('Hello')->addWord('World')->getString();
请注意,只有在创建对象的实例(使用$this
关键字时,才可以引用new
,而不是在声明为{{ 1}}。静态方法仍然可以具有这种模式,但是它将需要返回其他一些对象,例如static
(当前类的新实例)或new self
(先前创建的对象)。 / p>
答案 1 :(得分:0)
它称为kombu==4.1.0
,如果要链接同一类中的方法,则必须从要调用fluent interface
的每个方法中返回this
,因此代码应类似于:
fluently
应用更改后,构造public static $query;
public function getArray($arr) {
Database::$query = $arr;
return $this;
}
public function single() {
return Database::$query[0];
}
将起作用,但是您可以考虑重命名方法Database::getArray(array("test","test2"))->single();
,因为顾名思义,它不应该返回getArray
,而是数组< / p>
@EDIT
您应该将函数$this
的类型从getArray
更改为public static function
以使其起作用,而且您的最终声明也将更改为:
public function
但是,在这种情况下,我会考虑重新设计您的类并创建某种单例,以便您仅实例化(new Database())->getArray(array("test","test2"))->single();
类一次并将对象存储在某个地方