我是 php 新手并从php.net学习它。以下参考链接上的注释说:
使用 empty() 时,仅当ArrayAccess::offsetExists()返回TRUE时,才会调用 ArrayAccess::offsetGet() 并检查是否为空。
这是什么意思?
参考链接(http://php.net/manual/en/arrayaccess.offsetexists.php)。
我是 php 新手并从php.net学习它。以下参考链接上的注释说:
使用 empty() 时,仅当ArrayAccess::offsetExists()返回TRUE时,才会调用 ArrayAccess::offsetGet() 并检查是否为空。
这是什么意思?
参考链接(http://php.net/manual/en/arrayaccess.offsetexists.php)。
如果您想知道实现 ArrayAccess
的对象上会发生什么(从问题中并不完全清楚),那么这里是交易:empty()
或类似空的测试(例如if ( $myObject ) ...
)将始终返回 TRUE,您无能为力.
此行为在 PHP 的错误跟踪器中标记为“不是错误”:https ://bugs.php.net/bug.php?id=62155 。错误报告专门针对Countable
,但在大多数情况下ArrayAccess
,Countable
两者都会被实现。
ArrayAccess
在实现和/或时要牢记这一点Countable
:不可能让你的对象表现得完全像一个数组。
对于空的测试,您将不得不求助于:
$myObject->isEmpty()
count()
结果(Countable
必须实现这一点才有意义)。希望这会有所帮助,但太多的逻辑组合并不总是有帮助......
empty()
用于检查一个值是否被认为是“空”,这意味着它要么不存在,要么该值为假(http://php.net/manual/en/function.empty.php)。
为了能够在实现 ArrayAccess 的类中检查这一点(例如允许数组类型访问的类 - 使用 []),这意味着该过程有两个阶段。
首先 - 元素是否存在。这是通过调用offsetExists()
您要检查的元素来完成的。因此,使用$data = [1,2];
,并且您检查元素 2,offsetExists()
将返回 false(只有 0 和 1 具有值)-这empty()
将返回 true-因为条件 1(该项目不存在)为 true。调用确实存在的元素 1,empty()
将返回 false ( http://php.net/manual/en/arrayaccess.offsetexists.php )。
其次,如果该项目确实存在,则第二部分empty()
表示如果值为 false,它也被认为是空的。 offsetGet()
将从您正在测试的元素中获取值。因此$data[true,false]
,当offsetGet()
为元素 0 调用时,它将返回位置 0 处的值 - 这是值 true。条件 2 表示该值是否为 false,在这种情况下并非如此,因此empty()
将返回 false。但是调用值为 false 的元素 1empty()
将返回 true。