NAMESPACE_SEPARATOR常数

ts.*_*ts. 5 php coding-style namespaces

在PHP中使用名称空间非常棒.将'\'作为命名空间分隔符有点......尴尬(但如果有人认为这很酷且很性感,我会在这篇帖子中添加标签"rant".).

所以,这里提出的问题是:

您是否在代码中使用NAMESPACE_SEPARATOR常量?如下面的代码:

<?php

if (!\defined('NAMESPACE_SEPARATOR') {

    \define('NAMESPACE_SEPARATOR', '\\');

} // if
Run Code Online (Sandbox Code Playgroud)

优点:

  • 与DIRECTORY_SEPARATOR一致(其中所有我们的使用;)
  • 没有逃脱的混乱(想想'\ Foo\Bar'但是'\\'.Foo'.'\\'.'Bar')
  • 更具可读性(恕我直言)
  • 这使我们有机会编写好的,名称空间感知的自动加载器
  • 如果发生可怕的事情,可以抵制另一个变化(就像使用来自PHP 6 alpha的ol'good'::')
  • 在陌生人的编程语言中可以隐藏'\'作为命名空间操作符;)

缺点:

所以,你在想什么?

Álv*_*lez 6

我不确定我的观点是什么...... PHP常量与C预处理器宏不同.你不能创建一个宏并用它替换一个运算符 - 它只是不起作用:

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

即使它奏效了,目的是什么?隐藏语言的语法使其看起来像您熟悉的另一种语言是相当浪费时间,更不用说它使其他编码人员更难以处理项目.如果您认为语言X看起来更酷,那么,只需代码X而不是PHP :)

更新

在需要作为字符串的地方使用命名空间分隔符(例如自动加载器和回调)在使用单引号时几乎没有什么困难,因为它需要转义的唯一地方就在引号或另一个反斜杠之前,因此它可以写AS-是:

$callback = 'Foo\Bar';
Run Code Online (Sandbox Code Playgroud)

所有其他选项看起来像不必要的复杂性:

$callback = "Foo\\Bar";
$callback = 'Foo' . NAMESPACE_SEPARATOR . 'Bar';
$callback = "Foo{$namespace_separator}Bar";
Run Code Online (Sandbox Code Playgroud)


Ian*_*Ian 6

是的是您的问题的答案.我确实使用自定义的NAMESPACE_SEPARATOR因为

str_replace(NAMESPACE_SEPARATOR, DIRECTORY_SEPARATOR, $classFileName);
Run Code Online (Sandbox Code Playgroud)

比我更清楚

str_replace('\\', DIRECTORY_SEPARATOR, $classFileName);
Run Code Online (Sandbox Code Playgroud)

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