Php define() Константы Внутри пространства имен

Как говорится в названии, я бы очень хотел прояснить это. Я прочитал несколько статей и сообщений здесь по этой теме, что-то просто не нажимает на меня. Я добавлю, что я немного новичок в 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 в глобальном масштабе, поэтому я не должен этого делать? Есть ли более эффективная практика?

Вся помощь очень ценится.

Ответы

Ответ 1

Если вы хотите определить константу в пространстве имен, вам нужно будет указать пространство имен в вашем вызове для определения(), даже если вы вызываете define() из пространства имен. Следующие примеры, которые я попытался, дадут понять.

Следующий код определит константу "CONSTANTA" в глобальном пространстве имен (т.е. "\ CONSTANTA" ).

<?php
namespace mynamespace;
define('CONSTANTA', 'Hello A!');
?>

если вы хотите определить константу для пространства имен, которое вы можете определить как

<?php
namespace test;
define('test\HELLO', 'Hello world!');
define(__NAMESPACE__ . '\GOODBYE', 'Goodbye cruel world!');
?>

Взято из Manual

Ответ 2

Использование констант с именами довольно просто, но вы должны использовать ключевое слово 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