2013-08-15 3 views
15

Как говорится в заголовке, я бы очень хотел прояснить это. Я прочитал несколько статей и сообщений здесь по этой теме, что-то просто не нажимает на меня. Я добавлю, что я немного новичок в Php. Хорошо, вот что я хочу понять;Php define() Константы Внутри пространства прояснения

namespace Information; 
define('ROOT_URL', 'information/'); 
define('OFFERS_URL', ROOT_URL . 'offers/'); 

namespace Products; 
define('ROOT_URL', 'products/'); 
define('OFFERS_URL', ROOT_URL . 'offers/'); 

Я хочу постоянного быть constructable, т.е. построить константы из базовой константы (ов), поэтому я использую определение («NAME», значения) ;.

Вопрос: будет ли значение ROOT_URL значением относительно его «пространства имен»? Как это;

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

или не определено(); место ROOT_URL в глобальном масштабе, поэтому я не должен этого делать? Есть ли более эффективная практика?

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

+4

Цитируя namual: 'Как суперглобальные, сфера константы global.' Они не в пространстве имен –

+0

@Mark Бейкер, спасибо так много. Как пометить ваш ответ как ответ и пометить вас? Просто хочу дать вам еще несколько точек ответа –

ответ

20

Если вы хотите определить константу в пространстве имен, вам нужно будет указать пространство имен в вашем вызове для определения(), даже если вы вызываете 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

+8

Для чего это стоит, это от комментариев пользователей, а не от фактического руководства. –

+0

Вы также можете импортировать константы с именами: 'use const Foo \ BAR'. Обратите внимание на _const_. – Bell

+0

Возможность импортировать их также доказывает, что это реальное пространство имен, в отличие от разрешенной косой черты в имени. – Bell

9

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

+1

Хотя этот ответ не касается непосредственно 'define()', это очень полезно. – BlitZ

Смежные вопросы