【问题标题】:Check existence of elements in a class's array constants in PHP 5.6在 PHP 5.6 中检查类的数组常量中是否存在元素
【发布时间】:2016-01-17 21:03:12
【问题描述】:

如何检查像 A\B::X['Y']['Z'] 这样的常量元素是否已设置?

<?php

namespace A;

class B
{
    const X = [
        'Y' => [
            'Z' => 'value'
        ]
    ];
}

var_dump(defined('\A\B::X') && isset(\A\B::X['Y']['Z']));

Fatal error: Cannot use isset() on the result of an expression (you can use "null !== expression" instead) in [...] on line 13

【问题讨论】:

  • @Rizier123 defined(A\B::X) 返回 true,但 defined(A\B::X['Y']['Z']) 返回 false :(
  • @Federico isset() 触发致命错误。
  • 你想检查常量是否存在以及它是否有一个元素集?
  • defined('A\B::X') &amp;&amp; isset(A\B::X['Y']['Z'])

标签: php constants


【解决方案1】:

isset 仅适用于变量。您可以使用以下代码检查A\B::X['Y']['Z'] 是否存在:

var_dump(
    defined('\A\B::X') &&
    array_key_exists('Y', \A\B::X) &&
    array_key_exists('Z', \A\B::X['Y'])
);

【讨论】:

  • 如果有人想知道:isset 适用于 PHP 7 中的常量数组。似乎在任何地方都没有记录
  • 很高兴知道,Ben Guest,谢谢。似乎不合逻辑, isset 不适用于显然设置为某些东西的常量数组。 PHP 团队终于解决了这个问题。 :)
【解决方案2】:

由于isset 适用于变量(我的错)而不适用于任意表达式,因此您可以改用array_key_exists

namespace A;

class B
{
    const X = [
        'Y' => [
            'Z' => 'value'
        ]
    ];
}

var_dump(array_key_exists('Y', \A\B::X) && array_key_exists('Z', \A\B::X['Y']));

【讨论】:

  • 顺便说一句,头像不错。 :-)
【解决方案3】:

您也可以简单地使用:

var_dump(@\A\B::X['Y']['Z'] !== NULL);

唯一需要注意的是,如果您的 const 可能被定义为 NULL,则您不能使用它。
在这种情况下,您可以选择给 const 一个 ''(空字符串) 值,这在 PHP 中是相当等价的。

【讨论】:

  • 谢谢,但根据我们公司的编码标准,STFU 运算符不是一个选项。就个人而言,我也不喜欢使用它。
  • @user5483434 我知道这有点宗教信仰。我同意建议不要在不谨慎的情况下使用它,但我坚决不同意它的全面(和盲目的,IMO)禁令。对不起,如果它没有帮助。
  • 请不要抱歉,兄弟,我根本没有想到您的解决方案,我真的很感谢您教我。但是根据我们的编码规则,在有其他适合我们需要的解决方案之前,我们不应该使用该运算符,但我们并不禁止在所有情况下使用它,例如,PDO 构造函数中存在一个错误,这是唯一的方法解决这个问题,正在使用这个运算符,在这种情况下我们是被允许的。实际上,虽然我们并没有被完全禁止,但我们使用 @ 运算符只是为了修复我们数兆字节的 PHP 代码中的错误。
  • @user5483434 感谢您的澄清和客气话。
  • 目前@ 错误控制运算符前缀甚至会禁用对将终止脚本执行的严重错误的错误报告。除其他外,这意味着如果您使用@ 来抑制某个函数的错误,并且该函数不可用或输入错误,则该脚本将在该处死掉而没有任何说明。
猜你喜欢
  • 1970-01-01
  • 2012-02-23
  • 1970-01-01
  • 1970-01-01
  • 2018-02-23
  • 2011-11-14
  • 2014-08-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多