为了账号安全,请及时绑定邮箱和手机立即绑定

为什么“key()”函数在与对象而不是数组一起使用时不会触发警告或错误?

为什么“key()”函数在与对象而不是数组一起使用时不会触发警告或错误?

PHP
千巷猫影 2022-09-17 21:34:02
在处理数组时,使用array_keys()来获取数组的键是微不足道的。在处理对象时,我们还有其他函数,如get_object_vars()来处理这些。因此,如果我们有两个简单的变量,一个数组和一个对象:+--------------------+---------------------------+|       Array        |          Object           |+--------------------+---------------------------+| $array = array(    | $object = new stdClass(); ||   'foo'  => 'bar', |                           ||   'john' => 'doe', | $object->foo  = 'bar';    ||   'beep' => 'bop'  | $object->john = 'doe';    || );                 | $object->beep = 'bop';    |+--------------------+---------------------------+如果我们获取该函数并将其传递给数组,它将执行我们期望的操作,并给我们一个带有 、 和 的数组:array_keys()foojohnbeepReturn: array(3) {  [0]=> string(3) "foo"  [1]=> string(4) "john"  [2]=> string(4) "beep"}当然,正如预期的那样,如果我们将对象传递给它,函数就会爆炸并且不知道该如何处理它(如果我们真的需要,我们可以转换甚至只是将其类型转换为数组):Return: NULLWARNING array_keys() expects parameter 1 to be array, object given但是,如果我们一次处理一个密钥,它似乎会变得更有趣一些。使用PHP的key()函数,我们可以提取我们想要的任何密钥。key($array); //returns: string(3) "foo"key($object); //returns: string(3) "foo"// If we move the internal pointerend( $array ); // key($array) returns: string(4) "beep"end( $object ); // key($object) returns: string(4) "beep"查看 key() 函数的文档,如果使用了 ,这不应该引发警告吗?我问是因为我很好奇,最近被否决了,并被告知不要在物体上使用。通常我使用其他方法,但在某些情况下使用没有警告(或错误) - 所以我决定查看,文档没有说任何关于允许,只是。我想类似的事情可以说数组指针的功能像.objectkey()key()objectarray &$arrayend()
查看完整描述

1 回答

?
偶然的你

TA贡献1841条经验 获得超3个赞

来自: https://www.php.net/manual/en/language.types.array.php

如果将对象转换为数组,则结果是一个数组,其元素是该对象的属性。键是成员变量名称,但有一些值得注意的例外:整数属性不可访问;私有变量在变量名称前面附加类名;受保护的变量在变量名称前面附加了“*”。这些预置值在两端都有空字节。这可能会导致一些意外行为

因此,在某些情况下,依赖在转换中未发生突变的键应被视为不可靠。


此外,根据给定的属性是否为 //,您可能无法获得预期的回报。publicprotectedprivate

https://www.php.net/manual/en/function.get-object-vars.php#47075


查看完整回答
反对 回复 2022-09-17
  • 1 回答
  • 0 关注
  • 84 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信