Php-define()常量内部命名空间澄清


Php define() Constants Inside Namespace Clarification

正如标题所述,我真的很想澄清这一点。我在这里读了一些关于这个话题的文章和帖子,有些地方对我来说不太合适。我补充说,我对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',);的原因;。

我的问题是,ROOT_URL的值会产生相对于其命名空间的值吗?像这样;

$info_offers_url = 'Information'OFFERS_URL;  ('information/offers/')
$prod_offers_url = 'Products'OFFERS_URL;     ('products/offers/')

或者执行define();将ROOT_URL放在全局范围内,因此我不应该这样做?有更好的练习吗?

我们非常感谢所有的帮助。

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

取自手动

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

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;