gpt4 book ai didi

php - 调用数组的成员函数

转载 作者:行者123 更新时间:2023-12-02 03:33:02 25 4
gpt4 key购买 nike

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

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

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();

没有出现调用数组上的成员函数 single() 错误。相反,让它只返回数组的第一个值。

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

最佳答案

当你调用一个方法时,返回值是该方法决定返回的值;返回值与调用该方法的对象没有任何自动关系。例如:

class A {
public function foo() {
return 'Hello, World!';
}
}
$a = new A;
echo $a->foo();

返回的值只是一个普通字符串,就像 foo 是一个未附加到任何对象的全局函数一样。

在 PHP 中,字符串(以及其他“基本类型”,如数组)不是对象,因此您不能对它们调用任何方法。即使可以,这些方法也会内置到语言中,并且您不能简单地决定可以在任何数组上调用 ->single()

可能令人困惑的是,有些人编写方法时遵循返回对象的约定,称为“流畅接口(interface)”,或更一般地说“链式方法”。这不是该语言的特性,只是从方法返回对象的自然结果:

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();

请注意,如果您创建了对象的实例(使用new关键字),则只能引用$this,而不是在声明为 static 的方法中。静态方法仍然可以具有这种模式,但它需要返回一些其他对象,例如 new self (当前类的新实例)或 self::$foo (之前创建的对象)。

关于php - 调用数组的成员函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51263199/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com