php反射API 簡單教程
說起反射ApI,自我感覺PHP中的反射ApI和java中的java.lang.reflect套件差不多,都是由可以列印和分析類別成員屬性、方法的一組內建類別組成的。可能你已經學過物件函數例如:get_class_vars()但是使用反射API會更加的靈活、輸出資訊會更加詳細。
首先我們需要知道,反射API不僅僅是用來檢查類別的,它本身包括一組類,用來完成各種功能:常用的類別如下:
Reflection類別 | #可以列印類別的基本訊息,(透過提供的靜態export()函數) |
ReflectionMethod類別 | #見名知意,列印類別方法、得到方法的具體資訊等 |
ReflectionClass類別 | 用於得到類別訊息,例如得到類別包含的方法,類別本的屬性,是不是抽象類等 |
ReflectionParameter類別 | #顯示參數的訊息,可以動態得到已知方法的傳參情況 |
ReflectionException類別 | # 用於顯示錯誤訊息 |
ReflectionExtension類別 | 得到PHP的擴充訊息,可以判斷擴充是否存在等 |
傳統的列印類別資訊與反射APi的差異
下面是一段我自己寫的參數程序,用於演示反射的使用:
<?php class Person { //成员属性 public $name; public $age; //构造方法 public function construct($name, $age) { $this->name = $name; $this->age = $age; } //成员方法 public function set_name($name) { $this->$name = $name; } public function get_name() { return $this->$name; } public function get_age() { return $this->$age; } public function get_user_info() { $info = '姓名:' . $this->name; $info .= ' 年龄:' . $this->age; return $info; } } class Teacher extends Person { private $salary = 0; public function construct($name, $age, $salary) { parent::construct($name, $age); $this->salary = $salary; } public function get_salary() { return $this->$salary; } public function get_user_info() { $info = parent::get_user_info(); $info .= " 工资:" . $this->salary; return $info; } } class Student extends Person { private $score = 0; public function construct($name, $age, $score) { parent::construct($name, $age); $this->score = $score; } public function get_score() { return $this->score; } public function get_user_info() { $info = parent::get_user_info(); $info .= " 成绩:" . $this->score; return $info; } } header("Content-type:text/html;charset=utf8;"); $te_obj = new Teacher('李老师', '36', '2000'); $te_info = $te_obj->get_user_info(); $st_obj = new Student('小明', '13', '80'); $st_info = $st_obj->get_user_info();
我們先用var_dump();打印類別的信息,如下所示,可以看出只是打印出類的簡單訊息,甚至連方法也沒有,所以從這樣的訊息中看不出其他游泳的訊息。
$te_obj);
object(Teacher)#1 (3) { ["salary":"Teacher":private]=> string(4) "2000" ["name"]=> string(9) "李老师" ["age"]=> string(2) "36" }
Reflection::export($obj);
# 我們利用Reflection提供的內建方法export來列印訊息,如下所示:
列印出的資訊比較完整,包括成員屬性,成員方法,類別的基本訊息,檔案路徑,方法訊息,方法屬性,傳參情況,所在檔案的行數等等。比較全面的展示了類的資訊。可以看出var_dump()或print_r只能顯示類的簡要信息,好多信息根本顯示不出來,所以他們只能做簡單的調試之用,反射Api則提供的類更多的信息,可以很好地幫助我們知道呼叫類別的情況,這對寫接口,特別是呼叫別人的接口提供了極大的便利。如果出了問題,也可以幫忙調試。object(Teacher)#1 (3) {
["salary":"Teacher":private]=>
string(4) "2000"
["name"]=>
string(9) "李老师"
["age"]=>
string(2) "36"
}
Class [ class Person ] {
@@ /usr/local/www/phptest/oop/reflaction.php 3-38
- Constants [0] {
}
- Static properties [0] {
}
- Static methods [0] {
}
- Properties [2] {
Property [ public $name ]
Property [ public $age ]
}
- Methods [5] {
Method [ public method construct ] {
@@ /usr/local/www/phptest/oop/reflaction.php 10 - 14
- Parameters [2] {
Parameter #0 [ $name ]
.....
反射API的具體使用:# 看過框架原始碼的同學都知道框架都可以載入第三方的插件、類別庫等等。下面這個例子咱們借助反射APi簡單實現這個功能,該例子原型是我從書上學習的,我理解後按照自己的思路寫了一套:要實現的功能:用一個類去動態的遍歷調用Property類對象,類別可以自由的載入其他的類別的方法,而不用吧類別嵌入到已有的程式碼,也不用手動去呼叫類別庫的程式碼。 約定:每個類別要包含work方法,可以抽象化一個介面。可以把每個類別的資訊放在檔案中,相當於各個類別庫訊息,透過類別保存的Property類別庫的對應對象,然後呼叫每個類別庫的work方法。
以下是基礎程式碼:
###/*属性接口*/ interface Property { function work(); } class Person { public $name; public function construct($name) { $this->name = $name; } } class StudentController implements Property { //set方法,但需要Person对象参数 public function setPerson(Person $obj_person) { echo 'Student ' . $obj_person->name; } //work方法简单实现 public function work() { echo 'student working!'; } } class EngineController implements Property { //set方法 public function setWeight($weight) { echo 'this is engine -> set weight'; } public function setPrice($price) { echo "this is engine -> set price"; } //work方法简单实现 public function work() { echo 'engine working!'; } }
class Run { public static $mod_arr = []; public static $config = [ 'StudentController' => [ 'person' => 'xiao ming' ], 'EngineController' => [ 'weight' => '500kg', 'price' => '4000' ] ]; //加载初始化 public function construct() { $config = self::$config; //用于检查是不是实现类 $property = new ReflectionClass('Property'); foreach ($config as $class_name => $params) { $class_reflect = new ReflectionClass($class_name); if(!$class_reflect->isSubclassOf($property)) {//用isSubclassOf方法检查是否是这个对象 echo 'this is error'; continue; } //得到类的信息 $class_obj = $class_reflect->newInstance(); $class_method = $class_reflect->getMethods(); foreach ($class_method as $method_name) { $this->handle_method($class_obj, $method_name, $params); } array_push(self::$mod_arr, $class_obj); } } //处理方法调用 public function handle_method(Property $class_obj, ReflectionMethod $method_name, $params) { $m_name = $method_name->getName(); $args = $method_name->getParameters(); if(count($args) != 1 || substr($m_name, 0, 3) != 'set') { return false; } //大小写转换,做容错处理 $property = strtolower(substr($m_name, 3)); if(!isset($params[$property])) { return false; } $args_class = $args[0]->getClass(); echo '<pre class="brush:php;toolbar:false">'; if(empty($args_class)) { $method_name->invoke($class_obj, $params[$property]); //如果得到的类为空证明需要传递基础类型参数 } else { $method_name->invoke($class_obj, $args_class->newInstance($params[$property])); //如果不为空说明需要传递真实对象 } } } //程序开始 new Run();
1:Reflection public static export(Reflector r [,bool return])//打印类或方法的详细信息 public static getModifierNames(int modifiers) //取得修饰符的名字 2:ReflectionMethod: public static string export() //打印该方法的信息 public mixed invoke(stdclass object, mixed* args) //调用对应的方法 public mixed invokeArgs(stdclass object, array args)//调用对应的方法,传多参数 public bool isFinal() //方法是否为final public bool isAbstract() //方法是否为abstract public bool isPublic() //方法是否为public public bool isPrivate() //方法是否为private public bool isProtected() //方法是否为protected public bool isStatic() //方法是否为static public bool isConstructor() //方法是否为构造函数 3:ReflectionClass: public static string export() //打印类的详细信息 public string getName() //取得类名或接口名 public bool isInternal() //类是否为系统内部类 public bool isUserDefined() //类是否为用户自定义类 public bool isInstantiable() //类是否被实例化过 public bool hasMethod(string name) //类是否有特定的方法 public bool hasProperty(string name)//类是否有特定的属性 public string getFileName() //获取定义该类的文件名,包括路径名 public int getStartLine() //获取定义该类的开始行 public int getEndLine() //获取定义该类的结束行 public string getDocComment() //获取该类的注释 public ReflectionMethod getConstructor() //取得该类的构造函数信息 public ReflectionMethod getMethod(string name) //取得该类的某个特定的方法信息 public ReflectionMethod[] getMethods() //取得该类的所有的方法信息 public ReflectionProperty getProperty(string name) //取得某个特定的属性信息 public ReflectionProperty[] getProperties() //取得该类的所有属性信息 public array getConstants() //取得该类所有常量信息 public mixed getConstant(string name) //取得该类特定常量信息 public ReflectionClass[] getInterfaces() //取得接口类信息 public bool isInterface() //测试该类是否为接口 public bool isAbstract() //测试该类是否为抽象类 4:ReflectionParameter: public static string export() //导出该参数的详细信息 public string getName() //取得参数名 public bool isPassedByReference() //测试该参数是否通过引用传递参数 public ReflectionClass getClass() //若该参数为对象,返回该对象的类名 public bool isArray() //测试该参数是否为数组类型 public bool allowsNull() //测试该参数是否允许为空 public bool isOptional() //测试该参数是否为可选的,当有默认参数时可选 public bool isDefaultValueAvailable() //测试该参数是否为默认参数 public mixed getDefaultValue() //取得该参数的默认值 5:ReflectionExtension类 public static export() //导出该扩展的所有信息 public string getName() //取得该扩展的名字 public string getVersion() //取得该扩展的版本 public ReflectionFunction[] getFunctions() //取得该扩展的所有函数 public array getConstants() //取得该扩展的所有常量 public array getINIEntries() //取得与该扩展相关的,在php.ini中的指令信息 }
以上是php反射API 簡單教程的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

PHP和Python各有優勢,選擇應基於項目需求。 1.PHP適合web開發,語法簡單,執行效率高。 2.Python適用於數據科學和機器學習,語法簡潔,庫豐富。

PHP是一種廣泛應用於服務器端的腳本語言,特別適合web開發。 1.PHP可以嵌入HTML,處理HTTP請求和響應,支持多種數據庫。 2.PHP用於生成動態網頁內容,處理表單數據,訪問數據庫等,具有強大的社區支持和開源資源。 3.PHP是解釋型語言,執行過程包括詞法分析、語法分析、編譯和執行。 4.PHP可以與MySQL結合用於用戶註冊系統等高級應用。 5.調試PHP時,可使用error_reporting()和var_dump()等函數。 6.優化PHP代碼可通過緩存機制、優化數據庫查詢和使用內置函數。 7

PHP和Python各有優勢,選擇依據項目需求。 1.PHP適合web開發,尤其快速開發和維護網站。 2.Python適用於數據科學、機器學習和人工智能,語法簡潔,適合初學者。

PHP在電子商務、內容管理系統和API開發中廣泛應用。 1)電子商務:用於購物車功能和支付處理。 2)內容管理系統:用於動態內容生成和用戶管理。 3)API開發:用於RESTfulAPI開發和API安全性。通過性能優化和最佳實踐,PHP應用的效率和可維護性得以提升。

PHP仍然具有活力,其在現代編程領域中依然佔據重要地位。 1)PHP的簡單易學和強大社區支持使其在Web開發中廣泛應用;2)其靈活性和穩定性使其在處理Web表單、數據庫操作和文件處理等方面表現出色;3)PHP不斷進化和優化,適用於初學者和經驗豐富的開發者。

PHP主要是過程式編程,但也支持面向對象編程(OOP);Python支持多種範式,包括OOP、函數式和過程式編程。 PHP適合web開發,Python適用於多種應用,如數據分析和機器學習。

PHP適合web開發,特別是在快速開發和處理動態內容方面表現出色,但不擅長數據科學和企業級應用。與Python相比,PHP在web開發中更具優勢,但在數據科學領域不如Python;與Java相比,PHP在企業級應用中表現較差,但在web開發中更靈活;與JavaScript相比,PHP在後端開發中更簡潔,但在前端開發中不如JavaScript。

PHP和Python各有優劣,選擇取決於項目需求和個人偏好。 1.PHP適合快速開發和維護大型Web應用。 2.Python在數據科學和機器學習領域佔據主導地位。
