如果 array_key_exists() 在 PHP7.4 中被弃用,那么如何使用 isset() 或 property_exists() 等替代方法来数组?

问题描述 投票:0回答:3

我已经尝试过

array_key_exists()
,但是当它返回预期结果时,流明显示错误消息,我需要使用另一个php函数而不是像本问题标题中提到的
array_key_exists()
isset()
那样的
property_exists()
.

$jsonData = "mydata.json";
$content = file_get_contents($jsonData);
$unsortedData = json_decode($content, true);

//convert array to object
$object = (object) $unsortedData;

$key = $request->input('key');
$keyData = "false";
if(array_key_exists($key, $object))
{
    $keyData = "true";
}

// usort($unsortedData,  function($a, $b){
//     return $a['no'] > $b['no'];
// });
return $keyData;
// var_dump($unsortedData);

应该使用哪一种以及如何使用?

php arrays object key array-key-exists
3个回答
3
投票

array_key_exists()
可以与对象一起使用,但该行为在 php 7.4.0 中已弃用并在 php 8 中删除:

注:

出于向后兼容性的原因,array_key_exists() 也将 如果 key 是在给定的对象中定义的属性,则返回 true 大批。从 PHP 7.4.0 开始,此行为已被弃用,并从 PHP 8.0.0.

要检查对象中是否存在属性, property_exists() 应该使用。

因此,您可以将代码更改为:

// Take note that the order of parameters is inverted from the array_key_exists() function
//                    |       |
//                    V       V
if(property_exists($object, $key))
{
    $keyData = "true";
}

0
投票

虽然上述答案解决了某些情况下的问题,但当您拥有受保护/私有属性时却无法解决问题。

我使用 array_key_exists 来检查该属性是否是私有/受保护的,其中最后一个属性将被函数标记为星号并返回 false,因为名称不匹配。

我这样解决了这个问题:

array_key_exists($key, (array)$obj);

所以即使在 php8 中,类型转换对象也应该解决它。 我认为在 php 7 及更早版本中,这是在幕后完成的。在 8 中他们删除了它,也许是性能问题??


0
投票

很多人推荐 property_exists($object, $key) 但它适用于对象或类属性而不是数组。 如果您检查数组,它将返回错误。

第一个参数必须是对象或现有类的名称

© www.soinside.com 2019 - 2024. All rights reserved.