【问题标题】:What does empty() method do when we implement ArrayAccess interface in php?当我们在php中实现ArrayAccess接口时,empty()方法做了什么?
【发布时间】:2018-03-18 21:26:04
【问题描述】:

我是 php 新手,向 php.net 学习。 注释在以下参考链接上说:

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

什么意思?

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

【问题讨论】:

    标签: php arrayaccess


    【解决方案1】:

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

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

    在实现ArrayAccess 和/或Countable 时要牢记这一点:不可能使您的对象的行为与数组完全一样。

    为了测试空,你将不得不求助于:

    1. 实现您自己的“类空”函数,例如$myObject->isEmpty()
    2. 在结果上显式调用 count()(必须实现 Countable 才有意义)。

    【讨论】:

      【解决方案2】:

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

      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 处的值——即值为真。条件 2 表示该值是否为 false,在这种情况下并非如此,因此 empty() 将返回 false。但是对于值为 false 的元素 1 调用,empty() 将返回 true。

      【讨论】:

      • 我来到这里是因为bugs.php.net/bug.php?id=62155 中描述的问题,即:empty() 在实现ArrayAccess 的对象上 上做了什么,而不是在它所代表的值上。您的描述只是关于后者,而问题,如果更好地表述,可能是关于前者的。要回答前一种情况的问题:您似乎不能使用 empty() 或 if ($obj) -tests 来测试实现 ArrayAccess 的空对象。您一直在检查 count() 或在对象上实现自己的“is_empty()”...
      • @zmippie 如果您想将其添加为答案,它可能会帮助喜欢您自己的其他人搜索此内容。但正如您所说,如果问题表述得更好,可能是关于前者的,这意味着该问题并不涉及您提到的案例。
      猜你喜欢
      • 2014-03-16
      • 1970-01-01
      • 1970-01-01
      • 2012-07-05
      • 2018-10-24
      • 2021-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多