手冊上寫php反射api中ReflectionClass的isSubClass方法接收的參數是一個字串類型,但是為什麼傳遞ReflectionClass對象進去,功能也是可以實現的?
class test1 { public $a;}class test1 extends test{ public $b;}$object1 = new ReflectionClass('test1');$object2 = new ReflectionClass('test2');var_dump($object2 -> isSubclassOf($object2));var_dump($object2 -> isSubclassOf('test1'));
這兩種輸出都是boolean true,需要的參數是字串,但是傳遞對象參數也是可行的,這是為什嗎?
回複內容:
手冊上寫php反射api中ReflectionClass的isSubClass方法接收的參數是一個字串類型,但是為什麼傳遞ReflectionClass對象進去,功能也是可以實現的?
class test1 { public $a;}class test1 extends test{ public $b;}$object1 = new ReflectionClass('test1');$object2 = new ReflectionClass('test2');var_dump($object2 -> isSubclassOf($object2));var_dump($object2 -> isSubclassOf('test1'));
這兩種輸出都是boolean true,需要的參數是字串,但是傳遞對象參數也是可行的,這是為什嗎?
因為在php的原始碼中這裡是可以傳入兩種類型,第一是string第二是reflectionclass。
github上的地址:github
代碼中很清楚的可以看到注釋中寫明
/* {{{ proto public bool ReflectionClass::isSubclassOf(string|ReflectionClass class) Returns whether this class is a subclass of another class */
並且在接下來的switch語句中也進行了判斷
switch (Z_TYPE_P(class_name)) { case IS_STRING: //some code case IS_OBJECT: //some code default: //some code }
php的外部維護者很多,所以文檔不是很詳細也是正常的,很多東西都需要自己去試。
大概手冊沒寫全。
is_subclass_of估計是參照這個函數,這個手冊說了可以傳遞對象。
這就算是php的一些漏洞(也算是優勢,畢竟靈靈活)。
推薦按照手冊上傳參數,因為這些小漏洞的話會在後續版本修補掉的。
或者你可以去看下php手冊的英文文檔,那個比中文文檔權威