gpt4 book ai didi

php - PHP 的 in_array() 方法如何识别数组中对象的特定实例的存在?

转载 作者:可可西里 更新时间:2023-11-01 00:28:41 24 4
gpt4 key购买 nike

我遇到了一些有趣的事情:in_array() 函数不仅在“针”是特定值时起作用,而且在它是特定对象实例时也起作用。我举个例子:

class Message{
private $str;
function __construct($str){
$this->str= $str;
}

}

$message1 = new Message('Hey there!');

$message2 = new Message('sup');

$message3 = new Message('yo');

$arr= [$message2, 545,'hey'];

echo in_array($message2 ,$arr) ? 'true' : 'false';

如您所见,我正在创建某个类的不同实例。对这些实例之一的引用被放入一个数组中。

当我检查数组中是否存在“message2”对象时,我得到了 true。如果我将 needle 更改为“message1”或“message3”,我将得到 false

这是如何运作的?该文档说它“检查数组中是否存在值”。 但是对对象的引用是“值”吗?有人可以澄清这个问题吗?

最佳答案

来自 PHP docs :

As of PHP 5, an object variable doesn't contain the object itself as value anymore. It only contains an object identifier which allows object accessors to find the actual object. When an object is sent by argument, returned or assigned to another variable, the different variables are not aliases: they hold a copy of the identifier, which points to the same object.

在“OOP”PHP(即 PHP < 5)时代之前,所有变量都是通过传递的。您始终可以使用 & 运算符通过引用传递变量,尽管这与使用指针的 C 语言不同。在 PHP5+ 中,对象不是通过引用传递的,但是对象变量不包含对象本身,而是对象的标识符。当您将该变量传递给函数时,该标识符的副本将作为参数发送,就像任何其他原语一样。

要理解的最重要的一点是,当您将对象传递给函数时,传递的不是对象本身,而是对象的标识符。这些标识符提供对对象本身的访问,同时仍然允许您在实例之间进行数组搜索和相等比较 (===)。

虽然 PHP 文档有点含糊,但我们可以看到对象标识符实际上是一个值:

the different variables are not aliases: they hold a copy of the identifier, which points to the same object.

包含对象的变量的值是对象标识符,而不是对象本身。

// $obj contains an identifier to an instance of `MyObject`
$obj = new MyObject();

当您将 $obj 传递给函数时,该标识符的副本 将作为参数发送。 PHP 总是按值传递变量,除非明确指示使用 &$var 按引用传递。因此,为了回答您的问题,对象的引用(或者更确切地说,标识符)实际上是一个可用于比较对象的特定实例的值。


编辑

正如@Chris Anderson 和@Lou 所指出的,in_array 默认情况下进行松散比较。比较两个对象时,==检查它们是否是同一实例并具有相同的属性值,而===检查它们是否是同一类的实例。除非我误解了,否则您最初的问题是询问存储类实例的变量的行为方式的性质,因此我的原始答案应该足以解决手头的问题。但是, 需要注意的是,如果对象的值是相同。

关于php - PHP 的 in_array() 方法如何识别数组中对象的特定实例的存在?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51504841/

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