32

正如标题所述,我真的很想澄清这一点。我已经阅读了一些关于这个主题的文章和帖子,但有些东西对我来说并不合适。我会补充一点,我对 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/')

还是定义();将 ROOT_URL 放在全局范围内,因此我不应该这样做吗?有更好的做法吗?

非常感谢所有帮助。

4

3 回答 3

49

如果要在命名空间中定义常量,则需要在对 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'

取自手册

于 2013-08-15T07:22:15.403 回答
16

使用命名空间常量相当容易,但您必须使用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 >= 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/

我希望这能帮到您。

来源: http: //php.net/manual/en/migration56.new-features.php

于 2016-03-15T09:50:09.353 回答
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;
于 2020-12-24T23:17:26.017 回答