2

我是 php 新手并从php.net学习它。以下参考链接上的注释说:

使用 empty() 时,仅当ArrayAccess::offsetExists()返回TRUE时,才会调用 ArrayAccess::offsetGet() 并检查是否为空。

这是什么意思?

参考链接(http://php.net/manual/en/arrayaccess.offsetexists.php)。

4

2 回答 2

2

如果您想知道实现 ArrayAccess的对象上会发生什么(从问题中并不完全清楚),那么这里是交易:empty()或类似空的测试(例如if ( $myObject ) ...)将始终返回 TRUE,您无能为力.

此行为在 PHP 的错误跟踪器中标记为“不是错误”:https ://bugs.php.net/bug.php?id=62155 。错误报告专门针对Countable,但在大多数情况下ArrayAccessCountable两者都会被实现。

ArrayAccess在实现和/或时要牢记这一点Countable:不可能让你的对象表现得完全像一个数组。

对于空的测试,您将不得不求助于:

  1. 实现自己的“类似空”的功能,例如$myObject->isEmpty()
  2. 显式调用count()结果(Countable必须实现这一点才有意义)。
于 2019-05-04T05:48:04.630 回答
0

希望这会有所帮助,但太多的逻辑组合并不总是有帮助......

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。

于 2017-10-07T06:07:34.200 回答