存在性檢查函數
| 函數 | 用途 | 回傳 |
function_exists($name) | 檢查函數是否已定義 | bool |
is_callable($var) | 檢查變數是否為合法可呼叫結構 | bool |
class_exists($name) | 檢查類別是否已定義 | bool |
method_exists($obj, $method) | 檢查物件/類別是否有某方法 | bool |
魔術常量(編譯期解析)
| 常量 | 說明 | PHP 版本 |
__FUNCTION__ | 當前函數名稱(區分大小寫) | 4.3.0+ |
__CLASS__ | 當前類別名稱(區分大小寫) | 4.3.0+ |
__METHOD__ | 當前類別方法名稱(區分大小寫) | 5.0.0+ |
注意: 前後各兩個底線 _ _。
反射獲取類別資訊
| 函數 | 說明 |
get_class($obj) | 取得物件所屬類別名稱 |
get_class_methods($class) | 取得類別所有方法名陣列 |
get_class_vars($class) | 取得類別所有屬性名陣列 |
實戰範例
class Demo {
public $name = 'test';
public function run() { echo __METHOD__; }
}
$obj = new Demo();
var_dump(function_exists('run')); // false(非全域函數)
var_dump(method_exists($obj, 'run')); // true
var_dump(class_exists('Demo')); // true
var_dump(get_class($obj)); // "Demo"
var_dump(get_class_methods('Demo')); // ["run"]
var_dump(get_class_vars('Demo')); // ["name" => "test"]
進階:ReflectionClass 完整反射
$rc = new ReflectionClass('Demo');
echo $rc->getName(); // 類別名
echo $rc->getFileName(); // 定義檔案
echo $rc->getStartLine(); // 起始行號
print_r($rc->getMethods()); // 所有方法 ReflectionMethod 陣列
print_r($rc->getProperties()); // 所有屬性 ReflectionProperty 陣列