2013-04-05 14 views
12

Se si tenta di utilizzare class_exists() all'interno di un metodo di una classe in PHP, è necessario specificare il nome completo della classe - lo spazio dei nomi corrente non viene rispettato. Per esempio, se la mia classe è:Esiste un'alternativa al namespace rispetto a class_exists() di PHP?

<? 
    namespace Foo; 

    class Bar{ 
     public function doesBooClassExist(){ 
      return class_exists('Boo'); 
     } 
    } 

e fischiano è una classe (che carica automaticamente correttamente) e si presenta così

namespace Foo; 

    class Boo{ 
     // stuff in here 
    } 

se provo:

$bar = new Bar(); 
$success = $bar->doesBooClassExist(); 
var_dump($success); 

si otterrà un falso ... c'è un modo alternativo per farlo senza dover specificare esplicitamente il nome completo della classe (es. class_exits('Foo\Boo'))?

+1

Hai provato ad anteporre il nome della classe con '__NAMESPACE__' nel metodo' doesBooClassExist() '? O sto fraintendendo quello che stai cercando di fare? (vedi http://www.php.net/manual/en/language.namespaces.nsconstants.php) – Crontab

+1

@Crontab Questo potrebbe essere fatto come si indica se non c'è un altro modo che sia già a conoscenza dello spazio dei nomi - solo una preferenza personale . Dovresti fare una risposta. – Ray

+0

Non sono sicuro, ma penso che sia corretto per il class_exists cercare non nello spazio dei nomi. Se controlla direttamente nello spazio dei nomi, come sarà possibile controllare la classe al di fuori di qualsiasi spazio dei nomi dall'interno? – Svetoslav

risposta

23

Prima di 5.5, il modo migliore per farlo è quello di utilizzare sempre il nome completo della classe:

public function doesBooClassExist() { 
    return class_exists('Foo\Boo'); 
} 

Non è difficile, e lo rende assolutamente chiaro che cosa ti riferisci. Ricorda, dovresti andare a leggere. Le importazioni di spazi dei nomi sono utili per la scrittura, ma rendono la lettura confusa (perché è necessario tenere a mente lo spazio dei nomi corrente e le eventuali importazioni durante la lettura del codice).

Tuttavia, in 5.5, c'è un nuovo costrutto venire:

public function doesBooClassExist() { 
    return class_exists(Boo::class); 
} 

Il class pseudo costante magica può essere messo su qualsiasi identificatore e verrà restituito il nome completo della classe che si risolverà a ... ....

+0

+ Questo è un approccio migliore – Baba

+0

Oh uomo, Boo :: la lezione sarà fantastica! – mattalxndr

+1

Non si deve eseguire il escape del backslash (in base alle [Domande frequenti PHP namespaces] (http://php.net/manual/en/language.namespaces.faq.php#language.namespaces.faq.quote))? – thirdender