首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NAMESPACE_SEPARATOR常数

NAMESPACE_SEPARATOR常数
EN

Stack Overflow用户
提问于 2010-05-18 07:55:37
回答 3查看 7.1K关注 0票数 5

在PHP中使用名称空间是很棒的。把'\‘作为命名空间分隔符有点.尴尬(但如果有人认为这是酷和性感,我是添加标签“咆哮”在这篇文章。;)。

所以,问题来了:

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

代码语言:javascript
复制
<?php

if (!\defined('NAMESPACE_SEPARATOR') {

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

} // if

优点:

  • 与DIRECTORY_SEPARATOR一致(是我们所有的使用的;)
  • 不要乱来转义(想想'\Foo\Bar‘但是'\’。傻瓜。“\”。“酒吧”)
  • 更具可读性(IMHO)
  • 这实际上为我们提供了一个编写良好的、具有名称空间感知的自动加载程序的机会。
  • 如果发生了可怕的事情,可以抵抗另一个变化(如ol‘’good::‘来自PHP 6 alpha)
  • 可以将“\”作为命名空间运算符在编程语言域中向陌生人隐藏其唯一性;)

缺点:

  • DIRECTORY_SEPARATOR的原因是该值与平台有关,而命名空间分隔符则不是。”(如http://bugs.php.net/bug.php?id=43046所述)
  • 19个字符而不是1(_)或4(‘\’__)
  • 有些地方不能使用这个(完全限定的类名作为默认的类变量),即:

那么,你在想什么?

EN

回答 3

Stack Overflow用户

发布于 2010-05-18 08:24:56

我不太明白你的意思.PHP常量不像C预处理器宏。您不能创建宏并用它替换运算符--它只是无法工作:

代码语言:javascript
复制
<?php
define('ADD', '+');
echo (3 ADD 5); // Parse error: syntax error, unexpected T_STRING
?>

即使成功了,目的是什么?隐藏一种语言的语法,使它看起来像你更熟悉的另一种语言,是很浪费时间的,更不用说它使其他程序员更难在这个项目上工作了。如果您认为X语言看起来更酷,那么只需编写X代码,而不是PHP :)

更新

在需要为字符串的地方使用命名空间分隔符(这类自动选项和回调)在使用单引号时几乎不会带来什么困难,因为需要转义的惟一位置是在引号或另一个反斜杠之前,因此可以将其编写为-

代码语言:javascript
复制
$callback = 'Foo\Bar';

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

代码语言:javascript
复制
$callback = "Foo\\Bar";
$callback = 'Foo' . NAMESPACE_SEPARATOR . 'Bar';
$callback = "Foo{$namespace_separator}Bar";
票数 6
EN

Stack Overflow用户

发布于 2012-04-04 07:03:51

是的是你问题的答案。我确实使用了自定义的NAMESPACE_SEPARATOR,因为

代码语言:javascript
复制
str_replace(NAMESPACE_SEPARATOR, DIRECTORY_SEPARATOR, $classFileName);

对我来说比

代码语言:javascript
复制
str_replace('\\', DIRECTORY_SEPARATOR, $classFileName);

它可能只在我的自动加载程序中使用,但是如果我几年前读了它,我想尽快理解它。

票数 6
EN

Stack Overflow用户

发布于 2014-08-23 12:19:08

在使用类名解析 (在PHP中称为类名标量)的类名寻址时,使用一种新的(PHP >5.5)方法或多或少地解决了这个问题。

虽然使用填充类名的字符串对于各种魔术仍然很有用,特别是自动加载,但是使用完全限定的类名,因为硬编码字符串容易出错,而且很难检测到IDE的字符串。

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

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

代码语言:javascript
复制
<?php

namespace My\Namespace;

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

当这个问题的范围太小时,它只会在代码的某个特定部分使用,这可能不会使PHP内置常量合法化。如果是这样的话,其他运算符,如作用域运算符,也应作为常量包括在内。"::“的PAAMAYIM_NEKUDOTAYIM常数?(对不起,这个小的常量命名phun)

按照这种方法,一个未实现的PHP特性可能会派上用场,那就是神奇的Class::命名空间常量。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2855395

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档