2013-08-15 4 views
15

Come afferma il titolo, vorrei davvero chiarire questo. Ho letto alcuni articoli e post qui su questo argomento, qualcosa non fa clic per me. Aggiungerò che sono un po 'nuovo per Php. OK, ecco cosa voglio capire;Definire() Costanti all'interno del chiarimento dello spazio dei nomi

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

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

Voglio le costanti di essere costruibile, cioè, costruire costanti da costante di base (s), è per questo che sto usando define ('NAME', valore) ;.

La mia domanda è, il valore di ROOT_URL darà il valore relativo al suo 'spazio dei nomi'? Come questo;

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

Oppure define(); posizionare ROOT_URL in un ambito globale, quindi non dovrei farlo? Esiste una pratica migliore?

Tutto l'aiuto è molto apprezzato.

+4

Citando dal namual: 'Come superglobals, il campo di applicazione di una costante è global.' Non sono namespace –

+0

@ Mark Baker, grazie mille. Come segnare la risposta come risposta, e in alto? Voglio solo darti altri punti rep –

risposta

20

Se si desidera definire una costante in uno spazio dei nomi, è necessario specificare lo spazio dei nomi nella chiamata per define(), anche se si chiama define() all'interno di uno spazio dei nomi. I seguenti esempi che ho provato chiariranno.

Il seguente codice definirà la costante "CONSTANTA" nello spazio dei nomi globale (ad esempio "\ CONSTANTA").

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

se si desidera definire costante per uno spazio dei nomi è possibile definire come

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

Brani dell 'Manual

+8

Per quello che vale, questo è dai commenti degli utenti, non dal vero manuale. –

+0

È inoltre possibile importare costanti con spazi dei nomi: 'usa const Foo \ BAR'. Nota il _const_. – Bell

+0

Essere in grado di importarli dimostra anche che è vero il namespaces invece del backslash permesso nel nome. – Bell

9

Uso delle costanti namespace è abbastanza facile, ma è necessario utilizzare const parola chiave.

quindi è possibile chiamare direttamente la costante usando una barra inversa \:

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 

Penso che questo è più pulita rispetto all'utilizzo define.

Detto questo, ciò che si vuole (assegnare un'espressione scalare a una costante) funziona solo se si utilizza 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/ 

Spero che questo vi aiuterà.

Fonte: http://php.net/manual/en/migration56.new-features.php

+1

Sebbene questa risposta non riguardi direttamente 'define()', è molto utile. – BlitZ