为什么PHP的in_array()方法在数组中识别出对象的特定实例的存在?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了为什么PHP的in_array()方法在数组中识别出对象的特定实例的存在?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2304字,纯文字阅读大概需要4分钟。
内容图文
![为什么PHP的in_array()方法在数组中识别出对象的特定实例的存在?](/upload/InfoBanner/zyjiaocheng/741/a6d997b699d74079ad8a9ce3bec2e6e2.jpg)
我遇到了一些有趣的事情: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:
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的in_array()方法在数组中识别出对象的特定实例的存在?全部内容,希望文章能够帮你解决为什么PHP的in_array()方法在数组中识别出对象的特定实例的存在?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。