2010-07-30 68 views
0

嘿所有我想用ReflectionClass加載一些類 在我的XML文件PHP ReflectionClass

定義,但我得到一個錯誤

Error while register class :Class ReportErrorHandler does not exist 

我不會當我將利用這個錯誤

require_once('handlers/system/ReportErrorHandler.php'); 

但我不想require_once類,這就是爲什麼我使用反射 和我的xml文件我只寫類名 沒有完整的路徑,所以我動態俊男require_once'

這裏是我的代碼

public function init(){ 
$doc = new DOMDocument(); 
$doc->load('server.xml'); 

$handlers = $doc->getElementsByTagName("handler"); 
foreach($handlers as $handler) { 
    $this->register($handler->nodeValue); 
} 
} 

public function register(&$name) { 
try{ 
    $intercafe = new ReflectionClass('Handler'); 

    $reflectionClass = new ReflectionClass($name); 

    if(!$reflectionClass->isSubclassOf($intercafe)){ 
    //LOG ERROR 
    error_log("Init-> Error ," + name + " is not a subclass of [net/Handler]"); 

    throw new InvalidArgumentException(); 
    } 

    error_log("register: " . $reflectionClass); 

    $handler = $reflectionClass->newInstance(); 
    $type = $handler->getType(); 

    //LOG DEBUG 
    syslog(LOG_DEBUG ,"Registering handler = " . $name . " TYPE = " . $type); 

    $key = $type << 32; 

    $this->table[$key] = $reflectionClass; 
}catch(Exception $ee){ 
    error_log("Error while register class :" . $ee->getMessage()); 
} 
} 

我的XML文件

<?xml version="1.0" encoding="UTF-8"?> 
    <server> 
    <server-version>0.1</server-version> 

    <handlers> 
     <handler>AuthenticateHandler</handler> 
     <handler>ReportErrorHandler</handler> 

     <handler>DisconnectedHandler</handler> 
     <handler>NoSuchRequestHandler</handler> 
    </handlers> 
    </server> 

回答

2

設置Autoloading

+0

這是我得到的, 錯誤而寄存器類:功能「ReportErrorHandler」未找到(函數'ReportErrorHandler'未找到或函數名無效) – shay 2010-07-30 15:11:11

+1

@shay就像@Mark所說的,你必須包含這些文件。自動加載器可以自動爲你做這件事,所以你不必編寫include語句,但你必須設置它,以便它可以找到你的類。它沒有關係如何在Java中完成。 PHP不是Java。 – Gordon 2010-07-30 15:30:28

3

,但我不希望require_once的 類,這就是爲什麼我使用 反射

即使反射需要知道它是什麼,它應該被反映。 爲什麼你不想包含/需要類定義?

+0

的原因,在我的XML只有一個類文件加載, 和我在想我自己,這是奇怪的把完整的路徑在XML中,並使用反射與解析的類名只有 和requirre_once與完整路徑, 我的意思是在java中,我不需要導入類,以反映它只是一個類 ,它不是一個實例 – shay 2010-07-30 15:04:16

+0

這是我必須要做的。使用require_once的完整路徑並使用className進行反射? – shay 2010-07-30 15:12:42

+0

這就是設置自動加載器的地方(正如Gordon所指出的那樣)會自動爲你包括/需要類文件......但即使是自動加載器,如果文件不在包含路徑中,仍然需要知道在哪裏尋找文件 – 2010-07-30 15:26:04

0

這就是沒有解決我的問題 我分開的完整路徑,require_once

public function register(&$name) { 
try{ 
    $intercafe = new ReflectionClass('Handler'); 

    $fullPath = $name; 
    $className = $name; 

    $index = strrpos($name , "/"); 
    if($index != False){ 
    $className = substr($name ,$index + 1); 
    } 

    $requirePath = 'handlers/' . $fullPath . '.php'; 
    require_once ($requirePath); 
    $reflectionClass = new ReflectionClass($className); 

    if(!$reflectionClass->isSubclassOf($intercafe)){ 
    //LOG ERROR 
    error_log("Init-> Error ," + name + " is not a subclass of [net/Handler]"); 

    throw new InvalidArgumentException(); 
    } 

    $handler = $reflectionClass->newInstance(); 
    $type = $handler->getType(); 

    //LOG DEBUG 
    syslog(LOG_DEBUG ,"Registering handler = " . $name . " TYPE = " . $type); 

    $key = $type << 32; 

    $this->table[$key] = $reflectionClass; 
}catch(Exception $ee){ 
    error_log("Error while register class :" . $ee->getMessage()); 
} 

}

相關問題