为什么yaml_parse_file返回true?

时间:2018-02-21 16:14:50

标签: php yaml pecl

出于某种原因,当我运行.php脚本时:

$s = yaml_parse_file("../config.yaml") || die("YAML file not found");
var_dump($s);

它返回:

  

BOOL(真)

到底是怎么回事?这已经无处不在,它在一个星期内工作正常,我似乎无法修复它。我已使用pecl install yaml安装并将"extension=yaml.so"添加到php.ini

我使用过在线yaml正则表达式测试仪,他们回来说没关系。格式是(显然有内容):

title: 
email: hello@
logo: images/logo.png
download-file: .dmg
recaptcha:
  pub:
  priv:
meta:
  keywords: mac, osx
  description:
  ico: images/icon.ico

2 个答案:

答案 0 :(得分:3)

您将布尔操作的结果分配给$s,因为||运算符的优先级高于赋值。所以它的评估如下:

$s = (yaml_parse_file("../config.yaml") || die("YAML file not found"));

返回true,因为初始表达式返回“truthy”值。

如果您将作业用括号括起来,它将按您的预期工作:

($s = yaml_parse_file("../config.yaml")) || die("YAML file not found");
...

请参阅https://eval.in/960405

答案 1 :(得分:1)

以前的代码工作时,用于阅读:

$s = yaml_parse_file("../config.yaml") or die("YAML file not found");

您最近更改了or ||(为什么?),却不知道他们是不同的运营商,他们有different precedence

or具有最低优先级,上面的表达式计算为:

($s = yaml_parse_file(...)) or die(...)

||的优先级高于赋值(=),问题中发布的表达式的评估结果为:

 $s = (yaml_parse_file(...) || die(...))

要解决此问题,首先应该忘记or die()。这是15年前PHP教程传播的错误编码实践。令人遗憾的是,他们中的许多人仍然可以上网,并教新手们在发生错误时如何在访客面前扔白页。

or die()没用。如果yaml_parse_file()(或者您使用它处理的任何函数调用)返回FALSE,则尝试使用该结果的下一个语句最有可能失败。并且您将在php_errors.log中获得或多或少的描述性错误消息。该错误消息可帮助您调试代码并识别和修复错误。 or die对任何事都没有帮助。它只是将错误隐藏在地毯下并告诉访问者他们自己可以看到的内容:您的网站无法正常工作。但它没有告诉你错误是什么或如何解决它。