PHP 有個 is_a ,主要功用是看某個物件是否是哪一個 class

doc: http://tw.php.net/manual/en/function.is-subclass-of.php

參數
PHP 4.2 以後
bool is_a ( object $object , string $class_name )
PHP 5.3.9 以後
bool is_a ( object $object , string $class_name [, bool $allow_string = FALSE ] )

這個 function 一年來改了兩次啊
在 PHP 5.3.7 以前,第一個參數只能是 object ,因此只要丟了 string 進去, is_a() 就一定回傳 false,如果你有丟 string 的需求,必需要改用 is_subclass_of()
在 2011/8/18 出來的 PHP 5.3.7 加上了第一個參數是 string 的支援,並且會 autoload 該 class 再來做 is_a() 的判斷。如此一來遇到的問題就是如果你有 spl_autoload_register() ,可能會因為第一個字串是不存在的 class 而狂噴 Warning
在 2012/1/10 出來的 PHP 5.3.9 又增加了第三個參數,要給 true 才會 autoload 該 class ,如果給 false 並且第一個參數是字串的話,則這個 function 只會 return false

等於這三次情況預設行為被改了兩次了

如果之前用法是第一個參數是 object 的寫法的話,恭喜你,完全沒有任何改變 (不過因為他的行為跟 instanceof 一模一樣,因此在 PHP 5.0.0 曾被標為 deprecated 過)
但是如果你的需求是判斷該 class name A(string) is a class name B(string)
在 PHP 5.3.7 之前的 is_a() 做不到
PHP 5.3.7 ~ 5.3.9 突然可以做到,而且還關不掉
PHP 5.3.9 以後又預設變成做不到,第三個參數要加 true 才做的到。

所以如果你想要寫一個 PHP 5.0 以後都可以使用的 is_a() 判斷的話
比較保險是改用 is_subclass_of() ,不過 is_a('ObjectFoo', 'ObjectFoo'); 是 true , is_subclass_of('ObjectFoo', 'ObjectFoo'); 是 false
這個需要注意

(今天踩到的雷,特此記錄一下..測試環境和線上環境的 PHP 版本還是要一樣比較好啊)
arrow
arrow

    榮尼王 發表在 痞客邦 留言(0) 人氣()