我在错误日志中收到此警告,并想知道如何在我的代码中更正此问题。
警告: PHP注意:未定义的属性:第440行的script.php中的stdClass :: $记录
一些代码:
// Parse object to get account id's
// The response doesn't have the records attribute sometimes.
$role_arr = getRole($response->records); // Line 440
记录存在时的响应
stdClass Object
(
[done] => 1
[queryLocator] =>
[records] => Array
(
[0] => stdClass Object
(
[type] => User
[Id] =>
[any] => stdClass Object
(
[type] => My Role
[Id] =>
[any] => <sf:Name>My Name</sf:Name>
)
)
)
[size] => 1
)
如果记录不存在则回复
stdClass Object
(
[done] => 1
[queryLocator] =>
[size] => 0
)
我在想像array_key_exists()这样的功能,但对于对象,什么?或者我是以错误的方式解决这个问题?
答案 0 :(得分:108)
if(isset($response->records))
print "we've got records!";
答案 1 :(得分:5)
您可以使用property_exists
http://www.php.net/manual/en/function.property-exists.php
答案 2 :(得分:5)
在这种情况下,我会使用:
if (!empty($response->records)) {
// do something
}
如果该属性不存在,您将不会收到任何丑陋的通知,并且您将知道您实际上已经获得了一些记录,即。 $ response-&gt;记录不是空数组,NULL,FALSE或任何其他空值。
答案 3 :(得分:4)
isset()适用于顶级,但是empty()更有助于查找是否设置了嵌套值。例如:
if(isset($json['foo'] && isset($json['foo']['bar'])) {
$value = $json['foo']['bar']
}
或者:
if (!empty($json['foo']['bar']) {
$value = $json['foo']['bar']
}
答案 4 :(得分:3)
如果您想使用property_exists
,则需要使用get_class()
在这种情况下,它将是:
if( property_exists( get_class($response), 'records' ) ){
$role_arr = getRole($response->records);
}
else
{
...
}
答案 5 :(得分:2)
响应本身似乎具有记录的大小。您可以使用它来检查是否存在记录。类似的东西:
if($response->size > 0){
$role_arr = getRole($response->records);
}
答案 6 :(得分:1)
根据您是否正在查找成员或方法,您可以使用这两个函数中的任何一个来查看特定对象中是否存在成员/方法:
http://php.net/manual/en/function.method-exists.php
http://php.net/manual/en/function.property-exists.php
更一般地说,如果你想要所有这些:
答案 7 :(得分:1)
如果认为这样可行:
if(sizeof($response->records)>0)
$role_arr = getRole($response->records);
新定义的属性也包括在内。
答案 8 :(得分:1)
错误控制运算符
如果预计会出现警告,则可以使用error control operator @
来禁止引发消息。
$role_arr = getRole(@$response->records);
虽然这可以减少代码中的混乱现象,但应谨慎使用,因为这可能会使调试将来的错误变得更加困难。使用@
可能会有用的一个示例是,当根据用户输入创建对象并通过验证方法运行该对象,然后再将其用于其他逻辑中。
空合并运算符
另一种替代方法是使用isset_ternary运算符??
。这样一来,您就可以避免警告,并以短一行的方式分配默认值。
$role_arr = getRole($response->records ?? null);