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