【问题标题】:What does mean if (\false) (yes, with backslash) in PHP?PHP 中的 if (\false)(是的,带有反斜杠)是什么意思?
【发布时间】:2017-10-24 10:55:25
【问题描述】:

今天早上,我收到通知,有一个新的Twig_Extensions 版本可用!耶!

在将其集成到twigfiddle 之前,我想查看changes。这主要是使用class_alias函数添加对命名空间的支持,然后添加仅包含遗留类的PSR-4对应类。

但是每个新的(命名空间的)类都是这样实现的:

<?php

namespace Twig\Extensions;

require __DIR__.'/../lib/Twig/Extensions/Extension/Text.php';

if (\false) {
    class TextExtension extends \Twig_Extensions_Extension_Text
    {
    }
}

这个符号是什么意思?

【问题讨论】:

  • 表示常量false定义在全局命名空间中
  • 我明白这意味着什么——但在这种情况下,它似乎在说——不要使用这个类定义。还是我错过了什么?!
  • 当然,编写该代码的人很快会将 Text.php 中 Text 类中的所有代码移至给定的新类中,并删除 if。准备地面的一种技巧。
  • 您基本上在问题中回答了您自己的问题 ;-) “命名空间”。

标签: php namespaces


【解决方案1】:

这意味着它正在使用全局命名空间中定义的 false..

经过一番研究,结果证明这个答案的其余部分是无意义的......我可以发誓你可以在某个时间点用 PHP 做到这一点。

我认为这是绕过的情况

<?php
namespace whywouldyoudothis;

false = true;
?>

我从未见过任何人为此编写代码,但这就是我想到的。

【讨论】:

  • 天啊!我喜欢 PHP ?
  • 实际上,像truefalsenull 这样的内置常量不能在命名空间中重新定义——这样做会导致致命错误(请参阅php.net/manual/en/…)。所以在它们前面加上反斜杠没有任何意义(也没有意义)。
【解决方案2】:

来自php manual

使用 \ 前缀的名称将指定该名称是必需的 即使在命名空间的上下文中也是全局空间。

【讨论】:

  • 我也这么认为。最大的问题是:如果在 false 前面加上斜线是没有意义的,为什么有人要编写这样的代码?即使在Google API-classes,他们也使用\false
【解决方案3】:

这是一个没有意义的代码,只是这是一个Unreachable code,因为 \false 总是假的!

【讨论】:

    【解决方案4】:
    if (\false) {
        class TextExtension extends \Twig_Extensions_Extension_Text
        {
        }
    }
    

    代码嗅探器和 IDE 仍然可以访问代码。但是我认为它应该有弃用说明。这样开发人员就会收到有关使用已弃用类的通知。

    这是来自 Twig 主存储库的示例。 https://github.com/twigphp/Twig/blob/v2.10.0/lib/Twig/Token.php

    【讨论】:

      猜你喜欢
      • 2013-10-24
      • 2015-02-02
      • 1970-01-01
      • 2021-06-15
      • 2022-01-17
      • 2022-11-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多