我们在php中实现ArrayAccess接口时empty()方法做了什么?

What does empty() method do when we implement ArrayAccess interface in php?

我是 php 的新手,正在向 php.net 学习。 注释 在以下参考文献 link 中指出:

When using empty() ArrayAccess::offsetGet() will be called and checked if empty only if ArrayAccess::offsetExists() returns TRUE.

这是什么意思?

引用 link(http://php.net/manual/en/arrayaccess.offsetexists.php).

希望这有帮助,虽然太多的逻辑组合并不总是有帮助...

empty() 用于检查一个值是否被认为是 'empty',这意味着它不存在或该值为假 (http://php.net/manual/en/function.empty.php).

为了能够在实现 ArrayAccess 的 class 中检查这一点(例如允许数组类型访问的 class - 使用 []),这意味着此过程有两个阶段。

首先-元素是否存在。这是通过使用您要检查的元素调用 offsetExists() 来完成的。因此,使用 $data = [1,2]; 并检查元素 2,offsetExists() 将 return 为假(只有 0 和 1 有值)- empty() 将 return 为真 - 作为条件 1(该项目不存在)为真。调用确实存在的元素 1,empty() 将 return false (http://php.net/manual/en/arrayaccess.offsetexists.php).

其次,如果该项目确实存在,empty() 的第二部分表示如果值为 false,它也被视为空。 offsetGet() 将从您正在测试的元素中获取值。因此 $data[true,false],当为元素 0 调用 offsetGet() 时,它将 return 位置 0 的值 - 即值 true。条件 2 表示如果值为 false,在本例中并非如此,因此 empty() 将 return false。但是调用了值为 false 的元素 1,empty() 将 return 为真。

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

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

实现 ArrayAccess and/or Countable 时要牢记:要使对象的行为完全像数组是不可能的。

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

  1. 实现您自己的 "empty-like" 功能,例如$myObject->isEmpty()
  2. 对结果显式调用 count()(必须实现 Countable 才有意义)。