2013-04-05 14 views
12

Jeśli spróbujesz użyć class_exists() wewnątrz metody klasy w PHP, musisz podać pełną nazwę klasy - bieżący obszar nazw nie jest przestrzegany. Na przykład, jeśli moja klasa jest:Czy istnieje alternatywa dla przestrzeni nazw dla PHP class_exists()?

<? 
    namespace Foo; 

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

A Boo jest klasa (które właściwie autoloads) i wygląda na to

namespace Foo; 

    class Boo{ 
     // stuff in here 
    } 

gdy próbuję:

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

dostaniesz Fałszywe ... czy istnieje alternatywny sposób zrobienia tego bez wyraźnego określenia pełnej nazwy klasy (np. class_exits('Foo\Boo'))?

+1

Czy próbowałeś poprzedzać nazwę klasy przez '__NAMESPACE__' w swojej metodzie' doesBooClassExist() '? Czy nie rozumiem, co próbujesz zrobić? (zobacz http://www.php.net/manual/en/language.namespaces.nsconstants.php) – Crontab

+1

@Crontab Można to zrobić, gdy wskażesz, czy nie istnieje inny sposób, który jest już znany w przestrzeni nazw - tylko osobiste preferencje . Powinieneś zrobić to odpowiedź. – Ray

+0

Nie jestem pewien, ale myślę, że jest to poprawne dla class_exists do wyszukiwania nie w przestrzeni nazw. Jeśli sprawdza bezpośrednio w przestrzeni nazw, w jaki sposób będzie można sprawdzić dla klasy poza przestrzeniami nazw od wewnątrz? – Svetoslav

Odpowiedz

23

Przed 5,5, najlepszym sposobem na to jest, aby zawsze używać pełną nazwę klasy:

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

To nie jest trudne, a to sprawia, że ​​absolutnie jasne, co masz na myśli. Pamiętaj, że powinieneś iść do czytelności. Importowanie Namespace jest przydatne do pisania, ale sprawia, że ​​czytanie jest mylące (ponieważ musisz pamiętać bieżący obszar nazw i importowanie podczas czytania kodu).

Jednak w 5,5, nowe konstrukt nadchodzi:

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

class pseudo magia stała można umieścić na dowolnym identyfikatorem i zwróci pełną nazwę klasy, która będzie go rozwiązać, aby ... ....

+0

+ To jest lepsze podejście – Baba

+0

Oh man, Boo :: class będzie świetnie! – mattalxndr

+1

Czy nie powinien być odwrócony ukośnik odwrotny (zgodnie z [PHP namespaces FAQ] (http://php.net/manual/en/language.namespaces.faq.php#language.namespaces.faq.quote))? – thirdender

Powiązane problemy