2012-12-18 20 views
7

Come posso recuperare automaticamente uno spazio dei nomi di classe?Ottieni dinamicamente lo spazio dei nomi della classe PHP

La magia var __NAMESPACE__ è inaffidabile perché in sottoclassi non è definito in modo corretto.

Esempio:

class Foo\bar\A ->__NAMESPACE__ === Foo \ bar

class Ping\pong\B extends Foo\bar\A ->__NAMESPACE__ === Foo \ bar (va Ping \ pong)

ps: ho notato lo stesso comportamento errato usando __CLASS__, ma ho risolto usando get_called_class() ... c'è qualcosa come get_called_class_namespace()? Come posso implementare tale funzione?

UPDATE:
Penso che la soluzione è nella mia stessa domanda, dal momento che mi sono reso conto get_called_class() restituisce il nome completo della classe e quindi posso estrarre lo spazio dei nomi da esso: D ... Comunque se v'è una più efficace approccio fammi sapere;)

+0

La soluzione è quello che ho avuto a che fare in codice personale. http://codepad.viper-7.com/EgObtf –

+0

Quello che descrivi non è un comportamento sbagliato. Scopri cosa contengono queste costanti: http://php.net/language.constants.predefined e, come hai trovato una soluzione al tuo problema, puoi rispondere alla tua domanda. – hakre

+0

Controlla questo. Penso che questo sia quello che vuoi dire: http://stackoverflow.com/questions/2317343/get-child-class-namespace-from-superclass-in-php/20193599#20193599 – Chris

risposta

9

lo spazio dei nomi di class Foo\Bar\A è Foo\Bar, in modo che il __NAMESPACE__ sta funzionando molto bene. Quello che stai cercando è probabilmente nomignolo con nomi dei nomi che potresti facilmente ottenere unendoti a echo __NAMESPACE__ . '\\' . __CLASS__;.

consideri il prossimo esempio:

namespace Foo\Bar\FooBar; 

use Ping\Pong\HongKong; 

class A extends HongKong\B { 

    function __construct() { 
     echo __NAMESPACE__; 
    } 
} 

new A; 

stamperà Foo\Bar\FooBar che è molto corretto ...

E anche se poi fare

namespace Ping\Pong\HongKong; 

use Foo\Bar\FooBar; 

class B extends FooBar\A { 

    function __construct() { 
     new A; 
    } 
} 

che verrà eco Foo\Bar\FooBar, che ancora una volta è molto corretto ...

EDIT: Se avete bisogno di ottenere lo spazio dei nomi della classe annidata all'interno del principale che è nidificazione, è sufficiente utilizzare:

namespace Ping\Pong\HongKong; 

use Foo\Bar\FooBar; 

class B extends FooBar\A { 

    function __construct() { 
     $a = new A; 
     echo $a_ns = substr(get_class($a), 0, strrpos(get_class($a), '\\')); 
    } 
} 
+3

stanno usando \ _ \ _ NAMESPACE \ _ \ _ nella classe genitore, ma vogliono lo spazio dei nomi della classe figlio. –

+0

Ahaa, non l'ho capito dalla domanda ... – shadyyx

+0

@MaximilianRuta Bene, grazie per la modifica, ma per favore, in futuro correggete solo ciò che è necessario correggere. Tutte le occorrenze di ** Tu ** sono cambiate in ** tu **? Questo è il mio stile di scrittura e mostrare un po 'di cortesia, quindi se non ti dispiace, lascia che mantenga il mio stile di espressione di me stesso. Grazie! Ringraziamo anche i revisori per aver approvato tali ** minori ** e non così tanto ** corretta ** richiesta di modifica ... Ben fatto! – shadyyx

9

In PHP 5.5, :: classe è disponibile che rende le cose più facili 10X. Per esempio. A::class

+0

Esempio http://php.net/manual/en/language.oop5.constants.php#example-179 – Jekis

Problemi correlati