在名称空间中定义常量的不同方法
Different ways to define a constant in a namespace
似乎有不同的方法可以将常量放入命名空间,并根据它们的定义方式选择显示它们的方式。
简要概述:
如果我定义一个常量并使用 namespace user;
,我以后就不能使用 \user\CONSTANT
来访问它。
如果用命名空间名称定义常量,例如define('user\USERNAME', 'James')
,我不需要使用 namespace user;
并且可以通过两种方式访问常量 - 使用 namespace user;
和 user\USERNAME
。
示例:
注:
所有示例都包含测试文件中使用的完整代码(如果缺少前一个示例中的代码,那是因为它未在新测试中使用)
define.php
namespace user;
define('USERNAME', 'James');
include 'display.php';
display.php
namespace user;
echo USERNAME; // Displays "James"
// This will NOT work (Fatal error: Undefined constant)
echo \user\USERNAME;
但是我可以用另一种方式在命名空间中设置常量:
define.php
define('user\USERNAME', 'James');
include 'display.php';
现在我有两种显示常量的方法:
display.php
namespace user;
echo USERNAME; // Displays "James"
AND
display.php
echo \user\USERNAME; // Displays "James"
两个显示"James"就好了。
我的问题
我不是在问 你 更喜欢什么等等,但是使用这些方法中的任何一种都有问题吗?
是因为性能更好(假设微秒毫无意义),还是一种方法会导致 PHP 中其他地方出现问题?
我知道没有像 namespace user;
那样显式设置命名空间意味着我没有将该文件中的任何其他内容设置为命名空间,如果我只想要命名空间中的常量,这就没问题。
这仅仅是根据场景的选择,还是出于某种原因某种方法不好?
如果只想在命名空间中定义常量,则应使用第二种变体。所以
define('user\USERNAME', 'James');
不仅是首选语法,而且是唯一正确的语法。如果你正在写
define('USERNAME', 'James');
那么您正在定义一个 GLOBAL CONST,即使您的定义调用是在用户命名空间内完成的。很明显这会起作用,因为您可以从命名空间内访问值 - 但也可以从任何命名空间内访问值,所以不是您想要的:)
似乎有不同的方法可以将常量放入命名空间,并根据它们的定义方式选择显示它们的方式。
简要概述:
如果我定义一个常量并使用 namespace user;
,我以后就不能使用 \user\CONSTANT
来访问它。
如果用命名空间名称定义常量,例如define('user\USERNAME', 'James')
,我不需要使用 namespace user;
并且可以通过两种方式访问常量 - 使用 namespace user;
和 user\USERNAME
。
示例:
注:
所有示例都包含测试文件中使用的完整代码(如果缺少前一个示例中的代码,那是因为它未在新测试中使用)
define.php
namespace user;
define('USERNAME', 'James');
include 'display.php';
display.php
namespace user;
echo USERNAME; // Displays "James"
// This will NOT work (Fatal error: Undefined constant)
echo \user\USERNAME;
但是我可以用另一种方式在命名空间中设置常量:
define.php
define('user\USERNAME', 'James');
include 'display.php';
现在我有两种显示常量的方法:
display.php
namespace user;
echo USERNAME; // Displays "James"
AND
display.php
echo \user\USERNAME; // Displays "James"
两个显示"James"就好了。
我的问题
我不是在问 你 更喜欢什么等等,但是使用这些方法中的任何一种都有问题吗?
是因为性能更好(假设微秒毫无意义),还是一种方法会导致 PHP 中其他地方出现问题?
我知道没有像 namespace user;
那样显式设置命名空间意味着我没有将该文件中的任何其他内容设置为命名空间,如果我只想要命名空间中的常量,这就没问题。
这仅仅是根据场景的选择,还是出于某种原因某种方法不好?
如果只想在命名空间中定义常量,则应使用第二种变体。所以
define('user\USERNAME', 'James');
不仅是首选语法,而且是唯一正确的语法。如果你正在写
define('USERNAME', 'James');
那么您正在定义一个 GLOBAL CONST,即使您的定义调用是在用户命名空间内完成的。很明显这会起作用,因为您可以从命名空间内访问值 - 但也可以从任何命名空间内访问值,所以不是您想要的:)