代码之家  ›  专栏  ›  技术社区  ›  ts.

名称空间分隔符常量

  •  5
  • ts.  · 技术社区  · 16 年前

    在PHP中使用名称空间非常好。使用“\”作为名称空间分隔符有点。。。尴尬(但如果有人认为这很酷和性感,我会在这篇文章中加上标签“rant”。)。

    所以,问题来了:

    您是否在代码名称空间中使用分隔符常量?如下代码所示:

    <?php
    
    if (!\defined('NAMESPACE_SEPARATOR') {
    
        \define('NAMESPACE_SEPARATOR', '\\');
    
    } // if
    

    赞成的意见:

    • 与目录_分隔符一致(其中 全部的 我们大多数人都在使用;)
    • 逃走没有麻烦(想想看) “\Foo\Bar” 但是 '\\' . Foo'.\'.'酒吧 )
    • 更具可读性(IMHO)
    • 这实际上为我们提供了一个编写良好的、具有名称空间意识的自动加载器的机会
    • 如果发生了可怕的事情,你可以抵制另一个改变(比如ol'good':'from PHP6 alpha)
    • 可以对陌生人隐藏编程语言land中作为命名空间运算符的“\”的唯一性;)

    欺骗:

    • “为什么 DIRECTORY_SEPARATOR 如果该值依赖于平台,则名称空间分隔符不是 http://bugs.php.net/bug.php?id=43046 )
    • 19个字符而不是1个( \ )或4( '\\' )
    • 有些地方不能使用此(完整限定类名作为默认类变量)即:

      <?php
      
      class A {
      
          protected $sDefaultReporterClass = '\My\Namespace\DefaultReporter';
      
      }
      

    你在想什么?

    3 回复  |  直到 14 年前
        1
  •  6
  •   Álvaro González    16 年前

    我不确定我是否理解你的意思。。。PHP常量与C预处理器宏不同。您不能创建宏并用它替换运算符,这只是行不通:

    <?php
    define('ADD', '+');
    echo (3 ADD 5); // Parse error: syntax error, unexpected T_STRING
    ?>
    

    即使成功了,目的是什么?隐藏一种语言的语法,让它看起来像你更熟悉的另一种语言,这是一种相当浪费时间的行为,更不用说这会让其他程序员更难完成这个项目。如果你觉得语言X看起来更酷,那么就编写代码X而不是PHP:)

    使现代化

    当使用单引号时,在要求名称空间分隔符为字符串的位置(如自动加载程序和回调)使用名称空间分隔符几乎没有困难,因为需要转义的位置仅在引号或另一个反斜杠之前,因此可以按原样编写:

    $callback = 'Foo\Bar';
    

    在我看来,所有其他选项都像是不必要的复杂性:

    $callback = "Foo\\Bar";
    $callback = 'Foo' . NAMESPACE_SEPARATOR . 'Bar';
    $callback = "Foo{$namespace_separator}Bar";
    
        2
  •  6
  •   Ian    14 年前

    是的,这就是你问题的答案。我确实使用了一个自定义的名称空间分隔符,因为

    str_replace(NAMESPACE_SEPARATOR, DIRECTORY_SEPARATOR, $classFileName);
    

    对我来说比

    str_replace('\\', DIRECTORY_SEPARATOR, $classFileName);
    

    它可能只在我的自动加载器中使用,但如果几年后我碰巧读过它,我想快速理解代码。

        3
  •  1
  •   Joffrey    12 年前

    现在,通过使用一种新的(PHP>5.5)方法通过使用 class name resolution (在PHP RFC中,它被称为 class name scalars ).

    虽然使用充满类名的字符串对于各种魔法仍然很有用,尤其是自动加载,但使用完全限定的类名作为硬编码字符串很容易出错,对于IDE来说很难检测到。

    这是如何回答最初的问题的:有时名称空间分隔符常量对于代码中非常特定的部分很有用,尽管我遇到的实际使用它的地方较少。

    在您的示例中,您更愿意使用:

    <?php
    
    namespace My\Namespace;
    
    class A {
        protected $sDefaultReporterClass = DefaultReporter::class;
    // or
        protected $sAnotherReporterClass = \Other\Namespace\Reporter::class;
    }
    

    当这个问题的范围很小时,它将只用于代码的特定部分,这可能不会使PHP内置常量合法化。如果是这样的话,像scope操作符这样的其他操作符也应该作为常量包含进来。PAAMAYIM_NEKUDOTAYIM常数:“?(很抱歉这个小常数命名为phun)

    按照这种方法,一个未实现的PHP特性可能会派上用场,那就是magic Class::namespace常量。

    推荐文章