2013-08-15 13 views
15

Jak wskazuje tytuł, bardzo chciałbym to wyjaśnić. Przeczytałem kilka artykułów i wpisów tutaj na ten temat, coś po prostu mi nie klika. Dodam, że jestem trochę nowy w PHP. OK, oto co chcę zrozumieć;Definicja php() Wewnętrzne objaśnienie obszaru nazw

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

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

Chcę stałe być constructable, czyli budować stałe ze stałego (-ów) bazowego, dlatego używam define („NAZWA”, wartość) ;.

Moje pytanie istota, będzie wartość root_url uzyskując wartość odpowiadającą jej nazw? Lubię to;

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

Lub definiuje(); umieść ROOT_URL w zasięgu globalnym, więc nie powinienem tego robić? Czy istnieje lepsza praktyka?

Cała pomoc jest bardzo doceniana.

+4

Cytując z namual: 'Jak superglobals zakres stały się global.' nie są one przestrzeni nazw –

+0

@Mark Baker, dziękuję bardzo. Jak oznaczyć odpowiedź jako odpowiedź, a następnie zaznaczyć? Po prostu chcę ci dać więcej punktów rep –

Odpowiedz

20

Jeśli chcesz zdefiniować stałą w przestrzeni nazw, będziesz musiał określić przestrzeń nazw w swoim wywołaniu funkcji define(), nawet jeśli wywołujesz funkcję define() z poziomu przestrzeni nazw. Poniższe przykłady, które wypróbowałem, jasno to wyjaśnią.

Poniższy kod definiuje stałą "CONSTANTA" w globalnej przestrzeni nazw (tj. "\ CONSTANTA").

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

jeśli chcesz zdefiniować stałe dla nazw można zdefiniować jak

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

Zrobiono z Manual

+8

To, co jest warte, pochodzi z komentarzy użytkowników, a nie z samej instrukcji. –

+0

Można również importować stałe o stałych nazwach: 'use const Foo \ BAR'. Zwróć uwagę na _const_. – Bell

+0

Możliwość importowania ich również pokazuje, że jest to prawdziwy obszar nazw, w przeciwieństwie do ukośnika odwrotnego dozwolonego w nazwie. – Bell

9

Korzystanie z przestrzeni nazw stałych jest dość łatwe, ale trzeba użyć const słowa kluczowego.

Następnie można wywołać bezpośrednio stałej stosując odwrotny ukośnik \:

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 

myślę, że to jest czystsze niż przy użyciu define.

Mimo, że to, co chcesz (przypisać skalarne wyrażenie na stałą) będzie działać tylko wtedy, gdy używasz 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/ 

Mam nadzieję, że to pomoże.

źródło: http://php.net/manual/en/migration56.new-features.php

+1

Chociaż ta odpowiedź nie dotyczy bezpośrednio 'define()', jest bardzo przydatna. – BlitZ