2015-02-09 50 views
0

我想了解PHP ReflectionClass,但有一些麻煩。在文檔中列出了3個類的修飾符:隱式抽象,顯式抽象和最終分別具有常數值16,32和64。我想知道隱式和顯式抽象修飾符是如何工作的?什麼時候是一個PHP類的隱式抽象?什麼是ReflectionClass :: IS_IMPLICIT_ABSTRACT用於?

我試圖找出它的試驗和錯誤與幾個簡單的類和接口,並使用ReflectionClass :: getModifiers()方法來查看發生了什麼,但我不明白的getModifiers方法的結果。使用下面的接口從getModifiers結果爲int(144):

interface Animal { 
    public function isYellow(); 
} 

$a = new ReflectionClass("Animal"); 
var_dump($a->getModifiers()); 

隨着修飾符常量是16,32和64分別我不明白是怎麼方法可以返回144呢?我是否誤解了某個位域是如何工作的,或者爲什麼我會得到這個結果?

更新:144位爲10010000,所以設置位是16和128.使接口隱含抽象。我想知道128是什麼意思?

我做了一些測試用類:

class Horse implements Animal { 
    public function hasTail() { return true; } 
} 

abstract class Predator implements Animal { 
    public function hasTeeth() { return true; } 
} 

abstract class Fish implements Animal { 
    public function isYellow() { return true; } 
} 

馬類會引發致命錯誤,但仍然定義的類。反射Horse並調用getModifiers會導致int(524304),其中隱式抽象位被設置。但是其他設置是什麼意思?

反映Predator類並調用getModifiers結果爲int(524336),其中設置了隱式和顯式抽象位。最後一個設置位與Horse類相同。

Fish類聲明爲抽象類,但沒有抽象方法。然後,getModifiers結果是int(524320),正如所期望的那樣,它具有顯式抽象位集合,但不包含隱式抽象位。

回答

0

可能有內部使用,根本沒有公開定義恆定值的其他改性劑,因此在值的差異:

使用

if ($a->getModifiers() & ReflectionClass::IS_IMPLICIT_ABSTRACT) 
    echo 'IS_IMPLICIT_ABSTRACT',PHP_EOL; 
if ($a->getModifiers() & ReflectionClass::IS_EXPLICIT_ABSTRACT) 
    echo 'IS_EXPLICIT_ABSTRACT',PHP_EOL; 
if ($a->getModifiers() & ReflectionClass::IS_FINAL) 
    echo 'IS_FINAL',PHP_EOL; 

將識別哪個定義的改性劑的應用

看反射源代碼揭示了以下定義:

REGISTER_REFLECTION_CLASS_CONST_LONG(class, "IS_IMPLICIT_ABSTRACT", ZEND_ACC_IMPLICIT_ABSTRACT_CLASS); 
REGISTER_REFLECTION_CLASS_CONST_LONG(class, "IS_EXPLICIT_ABSTRACT", ZEND_ACC_EXPLICIT_ABSTRACT_CLASS); 
REGISTER_REFLECTION_CLASS_CONST_LONG(class, "IS_FINAL", ZEND_ACC_FINAL_CLASS); 

所以所有的標誌都是基於內部定義的ZEND_ACC_ *常量,它們具有一系列附加值,這些附加值可能與反射有關,但可能仍然適用於類

+0

這實際上是有道理的,與內部修飾符,謝謝:)我也更新了我的問題與我從隱式與顯式抽象的更多測試中發現的。 – Silwing 2015-02-09 14:39:12

0

方法getModifiers()用於確定爲類(或接口或特徵)定義的類修飾符。

它返回的是一個int,它表示設置的不同位。

例如,如果位public的值爲1,並且位static的值爲2,那麼他們就是1 | 2(按位或),即3.您將獲得3回公共靜態類。這可以用於類和它的方法。

+0

是的,那是我對位的理解領域工作。然而,在ReflectionClass類中定義的唯一修飾符是我在文章中提到的那些修飾符。其中沒有一個加起來的結果144. – Silwing 2015-02-09 14:21:29