2015-10-04 53 views
2

我想獲取類層次結構頂部的子類的類的文件名,其中類層次結構的深度未知。獲取類層次結構頂部的子類的文件名,無論繼承的級別

I.e.我試圖找出該怎麼把代碼中baseApplicationClass爲了獲得myApplicationClass的文件名,將在這兩個例子中的工作:

baseApplicationClass 
L 
    abstract myApplicationClass extends baseApplicationClass 
    L 
     myInstanceClass extends myApplicationClass 

baseApplicationClass 
L 
    myApplicationClass extends baseApplicationClass 

使用get_class ($this)不起作用,因爲這給出了這兩個例子之間不一致的結果。

在這兩種情況下,我需要獲取myApplicationClass的文件名。

請注意,baseApplicationClass顯然有一個已知的名稱,而其他一個/兩個類沒有。

隨着兩層次結構(即第二實施例),I可以明顯做:

$reflector = new ReflectionClass (get_class ($this)); 
$applicationRoot = dirname ($reflector->getFileName()); 

但失敗了三個層級。

回答

1

我找到了一個解決方案:

# Get the classes in order, starting with baseApplicationClass, but not including the last in the chain 
$classHierarchy = array_reverse (array_values (class_parents ($this))); 

# Add in the last in the chain 
$classHierarchy[] = get_class ($this); 

# Get myApplicationClass 
$myApplicationClassName = $classHierarchy[1]; // Second in chain i.e. the direct child of baseApplicationClass 

# Reflect as normal 
$reflector = new ReflectionClass ($myApplicationClassName); 
$this->applicationRoot = dirname ($reflector->getFileName()); 

雖然也許有一些清潔劑!