检查类中是否存在元素';PHP5.6中的s数组常量
如何检查像a\B::X['Y']['Z']这样的常量元素是否已设置检查类中是否存在元素';PHP5.6中的s数组常量,php,constants,Php,Constants,如何检查像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'])); 由于isset适用于变量(my bad)而不是任意表达式,
<?php
namespace A;
class B
{
const X = [
'Y' => [
'Z' => 'value'
]
];
}
var_dump(defined('\A\B::X') && isset(\A\B::X['Y']['Z']));
由于isset
适用于变量(my bad)而不是任意表达式,因此可以使用array\u key\u 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']));
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'])
);
您也可以简单地使用:
var_dump(@\A\B::X['Y']['Z'] !== NULL);
唯一需要注意的是,如果您的const
可能被定义为NULL,则不能使用它。
在这种情况下,您可以选择为const
a'
(空字符串)值,这在PHP中相当等效。@Rizier123 defined(a\B::X)返回true,但defined(a\B::X['Y']['Z'])返回false:(@Federico isset()触发致命错误。是否要检查常量是否存在以及它是否有元素集?defined('a\B::X')&&isset(a\B::X['Y']['Z'])
谢谢,但根据我们公司的编码标准,STFU操作符不是一个选项。就我个人而言,我也不喜欢使用它。@user5483434我知道这有点宗教色彩。我同意不谨慎地建议不要使用它,但我坚决不同意它的总数(而且是盲目的,IMO)ban.抱歉,如果没有帮助的话。请不要抱歉,兄弟,我根本没有想到你的解决方案,我真的很感谢你教我这一点。但是根据我们的编码规则,我们不应该使用该运算符,直到有其他解决方案适合我们的需要,但我们并不是被禁止在所有情况下使用它,例如,PDO con中有一个bugstructor解决这个问题的唯一方法是使用这个操作符,在这种情况下我们是被允许的。实际上,虽然我们并没有被完全禁止,但我们使用@operator只是为了修复我们很多兆字节的PHP代码中的这个错误。@user5483434感谢您的澄清和友好的话语。目前@
错误控制操作符前缀w我甚至会禁用将终止脚本执行的关键错误的错误报告。除其他外,这意味着如果您使用@
来抑制某个函数中的错误,并且该函数不可用或输入错误,脚本将在那里死掉,而不说明原因。顺便说一下,这是一个不错的化身。:-)如果有人想知道:isset
使用PHP7中的常量数组。似乎没有记录在案很高兴知道Ben Guest谢谢。似乎不合逻辑的是,isset不适用于显然设置为某个值的常量数组。PHP团队最终完成了这项工作。:)