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是该值与平台有关,而命名空间分隔符则不是." (如http://bugs.php.net/bug.php?id=43046中所述)有些地方你不能使用它(完全限定类名作为默认类变量),即:
<?php
class A {
protected $sDefaultReporterClass = '\My\Namespace\DefaultReporter';
}
Run Code Online (Sandbox Code Playgroud)所以,你在想什么?
我不确定我的观点是什么...... 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)
是的是您的问题的答案.我确实使用自定义的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)
它可能只在我的自动加载机中使用,但我想快速理解代码,如果我碰巧在几年后阅读它.