正如标题所述,我真的想澄清一下。我已经阅读了一些关于这个主题的文章和帖子,有些事情并没有点击给我。我要补充说我对Php有点新鲜。好的,这就是我想要理解的内容;
namespace Information;
define('ROOT_URL', 'information/');
define('OFFERS_URL', ROOT_URL . 'offers/');
namespace Products;
define('ROOT_URL', 'products/');
define('OFFERS_URL', ROOT_URL . 'offers/');
我希望常量是可构造的,即从基本常量构建常量,这就是我使用define('NAME', value );.
的原因。我的问题是,ROOT_URL的值是否会产生相对于其命名空间的值?像这样;
$info_offers_url = \Information\OFFERS_URL; ('information/offers/')
$prod_offers_url = \Products\OFFERS_URL; ('products/offers/')
或者确定define();将ROOT_URL置于全局范围内,因此我不应该这样做?有更好的做法吗?
非常感谢所有帮助。
答案 0 :(得分:28)
如果要在命名空间中定义常量,则需要在调用define()时指定命名空间,即使您从命名空间中调用define()也是如此。我尝试过的以下示例将清楚说明。
以下代码将在全局命名空间中定义常量“CONSTANTA”(即“\ CONSTANTA”)。
<?php
namespace mynamespace;
define('CONSTANTA', 'Hello A!');
?>
如果要为命名空间定义常量,可以定义为
<?php
namespace test;
define('test\HELLO', 'Hello world!');
define(__NAMESPACE__ . '\GOODBYE', 'Goodbye cruel world!');
?>
否则,您可以使用const
在当前命名空间中定义常量:
<?php
namespace NS;
define('C', "I am a constant");
const A = "I am a letter";
echo __NAMESPACE__, , PHP_EOL; // NS
echo namespace\A, PHP_EOL; // I am a letter
echo namespace\C, PHP_EOL; // PHP Fatal error: Uncaught Error: Undefined constant 'NS\C'
取自Manual
答案 1 :(得分:10)
使用命名空间常量非常简单,但必须使用const
关键字。
然后你可以使用反斜杠\
:
namespace Dummy\MyTime;
const MONTHS = 12;
const WEEKS = 52;
const DAYS = 365;
namespace Test;
use Dummy\MyTime;
$daysPerWeek = MyTime\DAYS / MyTime\WEEKS;
$daysPerMonth = MyTime\DAYS / MyTime\MONTHS;
echo "Days per week: $daysPerWeek\n"; // 7.0192307692308
echo "Days per month: $daysPerMonth\n"; // 30.416666666667
我认为这比使用define
更清晰。
话虽如此,只有当你使用 PHP&gt; = 5.6 时,你想要的东西(将标量表达式赋给常量)才有效:
namespace Information;
const ROOT_URL = 'information/';
const OFFERS_URL = ROOT_URL . 'offers/';
namespace Products;
const ROOT_URL = 'products/';
const OFFERS_URL = ROOT_URL . 'offers/';
namespace Test;
$info_offers_url = \Information\OFFERS_URL; // information/offers/
$prod_offers_url = \Products\OFFERS_URL; // products/offers/
我希望这会对你有所帮助。
答案 2 :(得分:0)
define()
将完全按照指定定义常量。
基础知识:要在命名空间中定义常量,您必须在调用 define() 时指定命名空间,即使您是从命名空间内调用 define()
.
以下代码将在全局命名空间(即 MESSAGE
)中定义常量 \MESSAGE
。
<?php
namespace test;
define(‘MESSAGE’, ‘Hello world!’);
?>
以下代码将在“test”命名空间中定义两个常量。
<?php
namespace test;
define(‘test\HELLO’, ‘Hello world!’);
define(__NAMESPACE__ . ‘\GOODBYE’, ‘Goodbye cruel world!’);
?>
在太空中使用
namespace Product;
use const test\HELLO;