在数组上调用成员函数

时间:2018-07-10 10:43:52

标签: php arrays

我不真正了解链接函数如何处理返回的值。

假设我有一个返回字符串或数组的函数

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错误。而是让它仅返回数组的第一个值。

我该如何附加我在这里想要实现的目标?为什么我的逻辑错了?

2 个答案:

答案 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(); 类一次并将对象存储在某个地方