Php 名称空间分隔符常量

Php 名称空间分隔符常量,php,coding-style,namespaces,Php,Coding Style,Namespaces,在PHP中使用名称空间非常好。使用“\”作为名称空间分隔符有点。。。尴尬(但如果有人认为这很酷和性感,我会在这篇文章中加上标签“rant”。) 所以,问题来了: 是否在代码名称空间中使用分隔符常量?代码如下: <?php if (!\defined('NAMESPACE_SEPARATOR') { \define('NAMESPACE_SEPARATOR', '\\'); } // if 那么,你在想什么?我一点也不确定我是否明白你的意思。。。PHP常量与C预处理器宏不

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

所以,问题来了:

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

<?php

if (!\defined('NAMESPACE_SEPARATOR') {

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

} // if

那么,你在想什么?

我一点也不确定我是否明白你的意思。。。PHP常量与C预处理器宏不同。无法创建宏并用它替换运算符,因为它无法工作:

<?php
define('ADD', '+');
echo (3 ADD 5); // Parse error: syntax error, unexpected T_STRING
?>
所有其他选项在我看来都是不必要的复杂性:

$callback = "Foo\\Bar";
$callback = 'Foo' . NAMESPACE_SEPARATOR . 'Bar';
$callback = "Foo{$namespace_separator}Bar";

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

str_replace(NAMESPACE_SEPARATOR, DIRECTORY_SEPARATOR, $classFileName);
对我来说比

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

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

这个问题现在或多或少地通过使用一种新的(PHP>5.5)方法来解决(在PHP RFC中被称为)

虽然使用由类名填充的字符串对于所有类型的魔术仍然很有用,特别是自动加载,但使用完全限定的类名作为硬编码字符串容易出错,并且对于IDE来说很难检测到

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

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

<?php

namespace My\Namespace;

class A {
    protected $sDefaultReporterClass = DefaultReporter::class;
// or
    protected $sAnotherReporterClass = \Other\Namespace\Reporter::class;
}

你完全没有抓住重点。我的问题涉及自动加载程序和回调中名称空间分隔符的使用,通常,您将其用作字符串的一部分。是的,如果您知道“Foo”和“Bar”。这并不总是被给予的。你经常面对这样的事情,比如说,$packagee.“\\”$是的,试着在正则表达式中使用它任何人(是的,我故意夸大了反斜杠的数量)我觉得你想得太多了。如果你想实现一个userland
NAMESPACE\u分隔符
常量,那就直接去吧;如果它对您有效,那就太好了,否则请像我们其他人一样,坚持正常地打印出来。:)谢谢你的宝贵意见
str_replace('\\', DIRECTORY_SEPARATOR, $classFileName);
<?php

namespace My\Namespace;

class A {
    protected $sDefaultReporterClass = DefaultReporter::class;
// or
    protected $sAnotherReporterClass = \Other\Namespace\Reporter::class;
}