为什么PHP的in_array()方法在数组中识别出对象的特定实例的存在
我遇到了一些有趣的事情:in_array()函数不仅在“needle”是特定值时起作用,而且在它是特定对象实例时也起作用.我举个例子:
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”对象时,我得到了真实.如果我将针更改为“message1”或“message3”,我将得到错误. 这是如何运作的?文档说它“检查数组中是否存在值”.但是对象是一个“价值”吗?有人可以澄清这个问题吗? 解决方法
从PHP
docs:
在“OOP”PHP(即PHP <5)之前,所有变量都按值传递.你总是可以通过使用&参考来传递一个变量.运算符,虽然这与使用指针的C语言不同.在PHP5中,对象不是通过引用传递的,但是对象变量不包含对象本身,而是包含对象的标识符.将该变量传递给函数时,该标识符的副本将作为参数发送,就像任何其他原语一样. 最重要的是要理解的是,当您将对象传递给函数时,对象本身不会被传递,而是传递给对象的标识符.这些标识符提供对对象本身的访问,同时仍允许您在实例之间进行数组搜索和相等比较(===). 虽然PHP文档有点神秘,但我们可以看到对象标识符实际上是一个值:
包含对象的变量的值是对象标识符,而不是对象本身. // $obj contains an identifier to an instance of `MyObject` $obj = new MyObject(); 将$obj传递给函数时,会将该标识符的副本作为参数发送. PHP总是按其值传递变量,除非明确指示使用& $var通过引用传递.因此,为了回答您的问题,对象的引用(或更确切地说,标识符)实际上是可用于比较对象的特定实例的值. 编辑 正如@Chris Anderson和@Lou指出的那样,in_array默认情况下会进行宽松的比较.比较两个对象时,==检查它们是同一个实例并具有相同的属性值,而===检查它们是同一个类的实例.除非我误解,否则你的原始问题是询问存储类实例的变量的性质,所以我的原始答案应该足以满足手头的问题.但是,重要的是要注意,如果没有明确要求严格比较(===),如果对象的值相同,您将得到真实. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |