摘要
比起Java的反射,PHP中的反射可真的是良心之作。雖然從維修的角度來看,Java更勝一籌也更有優勢。但是繁瑣的處理也為Java的反射機制增加了一定的學習成本。
今天嘗試著使用PHP的反射技術來獲取類別的資訊。
核心操作可以在PHP的官方說明文件上看到,這裡用得最多的就是
getProperties getMethods
目標類別
為了更好的演示反射的結果以及維護,下面就先創建一個類,目錄結構如下:
<?phpclass Person { private $name; private $age; private $address; public function __construct($name, $age, $address) { $this->name = $name; $this->age = $age; $this->address = $address; } public function setter($key, $value) { exec ( "{$this}->" . $key . "={$value}" ); } /** * 通配型的getter方法不好用。 * <br /> * 原因: Object Person can not be converted to string. * * @param unknown $key * @return string */ public function getter($key) { return exec ( "$this" . "->{$key}" ); } /** * 模拟Java语言实现的getter方法。<br /> * * 缺点: 需要为每一个private属性提供单独的getter方法,使得代码略显臃肿。 */ public function getName() { return $this->name; } }class Grade { private $name; public function __construct($name) { $this->name = $name; } public function setName($name) { $this->name = $name; } public function getName() { return $this->name; } }
加載問題
加載機制
#在正式進行在反射操作之前,先來探討一下__autoload
自動載入機制。顧名思義,自動化的進行載入(類,也可以是其他php檔案)唄。
對於更深層而言,這就牽涉到PHP解譯器的工作原理了。也就是說,我們不可能一個專案只寫一個php文件,相反,一個專案中可能會有數以百計的php文件,而且不可避免的會進行相互呼叫。
也就是說,我們在A檔案中宣告並實作了一個加法函數,而需要在B檔中進行呼叫。很明顯B檔案中根本沒有實作這個加法,所以PHP解譯器就沒辦法進行加法運算了。
這時候就需要讓PHP解釋器知道這個加法怎麼做,於是就需要require / include
包含了這個加法函數的A檔了。
這樣,PHP解譯器就知道如何解釋並執行咱們的PHP檔了。
與PHP相似的是,在Java語言中我們只需要在來源檔案前面加上import
語句,Java虛擬機器就能自動的在相關的類別資訊了。而且強型別的Java可以在編譯之前就發現這樣的問題,所以程式碼維護起來比較方便一點。而PHP則需要進行手動的 include/require
了。
但應該要清楚的是,這兩者換湯不換藥而已。
自動載入機制
但是如果對每一個要被引用的php檔案進行手動的載入的話,可能就要寫好多個這樣的載入語句了。所以為了方便處理這種問題,PHP5之後引入了自動載入機制。
void __autoload ( string $class )
$class
是要進行載入的類別的名稱,請注意是類別
的名稱。
怎麼使用?
既然自動載入機制這麼好,那我們要怎麼使用呢?
答案就是在需要載入其他類別檔案的php中,加入一個自訂的__autoload($class)
函數即可。 還是以剛才的文件AB來舉例。
檔案A中有一個寫好的類別Person,在檔案B中要進行使用。這時候在檔案B中加入一個__aotoload
函數即可。而且這個函數的寫法也比較的簡單(一切按照最簡思路來設計的話)。
function __autoload($class) { $filename = "$class.class.php"; if(!file_exists($filename)){ throw new RuntimeException("$filename 文件不存在!"); }else { require "$filename"; } }
PHP解釋器在掃描到檔案B的時候會先進行檢查,如果未引入目標類別Person,則會判斷有沒有實作__autoload
,如果存在則使用自動載入函數進行加載,否則報錯退出。
注意問題
雖然上面的自動載入函數比較簡單,但是現實中卻需要為此付出很多的“代價”,也就是被載入的類別文件的名稱要和類別保持一致(無需區分大小寫)。如:
要加载的类的名称为Person, 则该类所在的文件的名称需要为person.class.php,或者Person.class.php
而且,路徑問題也是一個比較棘手的問題,在這個簡易的自動載入函數中也不難看到,這裡他們位於同級目錄下,試想一下不滿足這個條件的情形,就可以知道這個自動載入函數的程式碼量將會多大了吧。
如此的話,也會違反了自動載入機制的設計的初衷。所以按照特定的目錄結構存放相關的類別文件是非常有必要的。
所謂:增加了冗餘的特點,卻帶來了容易維護的好處。
個人覺得,不妨按照Java語言的目錄結構來維護PHP程序,這樣會有意想不到的收穫的。
反射
下面正式進入反射的話題,在摘要部分已經提到。重點就在於ReflectionClass
的使用。
反射屬性
<?phprequire './bean/beans.php'; // Person 在beans.php文件中声明$protype = new ReflectionClass("Person"); // 可以添加一个参数,来进行过滤操作。如只获取public类型的属性 $properties = $protype->getProperties(); // 反射获取到类的属性信息 foreach ($properties as $property) { echo $property."<br />"; }
比比Java,要取得 private
屬性,PHP更為簡單。
反射方法
<?php require './bean/beans.php'; $protype = new ReflectionClass("Person"); $methods = $protype->getMethods(); foreach ($methods as $method) { echo $method->getName()."<br />"; }
另外,還可以加入篩選條件。給getMethods方法天機一個過濾參數即可。
filter过滤结果为仅包含某些属性的方法。默认不过滤。 ReflectionMethod::IS_STATIC、 ReflectionMethod::IS_PUBLIC、 ReflectionMethod::IS_PROTECTED、 ReflectionMethod::IS_PRIVATE、 ReflectionMethod::IS_ABSTRACT、 ReflectionMethod::IS_FINAL 的任意组合。
反射注释
注释信息,这里就以文档信息为例。
<?phprequire './bean/beans.php'; $protype = new ReflectionClass ( "Person" ); $properties = $protype->getProperties (); // 反射获取到类的属性信息 foreach ( $properties as $property ) { echo $property . ":"; $doc = $property->getDocComment (); echo " " . $doc . "<br />"; e cho "--------------------------------------------------------" . "<br />"; }$methods = $protype->getMethods(); foreach ($methods as $method) { echo $method->getName()."<br />"; $doc = $method->getDocComment (); echo " " . $doc . "<br />"; echo "--------------------------------------------------------" . "<br />"; }
反射实例化
詳解PHP反射技術的程式碼範例(圖文)
<?phprequire './bean/beans.php'; $protype = new ReflectionClass ( "Person" );// 模拟数据库中获取到的值,以关联数组的形式抛出 $values = array( "name"=>"郭璞", "age"=> 21, "address"=>"辽宁省大连市");// 开始实例化 $instance = $protype->newInstanceArgs($values); print_r($instance);// var_dump($instance); echo $instance->getName();
反射Grade类
<?phprequire './bean/beans.php';$classprotype = new ReflectionClass("Grade");$class = $classprotype->newInstanceArgs(array("name"=>"大三")); var_dump($class);echo $class->getName();
执行类的方法
$instance->getName(); // 执行Person 里的方法getName// 或者: $method = $class->getmethod('getName'); // 获取Person 类中的getName方法$method->invoke($instance); // 执行getName 方法// 或者:$method = $class->getmethod('setName'); // 获取Person 类中的setName方法$method->invokeArgs($instance, array('snsgou.com'));
总结
回顾一下,本次试验演示了PHP中的反射技术,对比分析了Java语言的反射技术的实现。也只能说各有利弊吧。
在Java中,反射技术是编写框架的基础。虽然在PHP中反射技术不是特别的重要,而且用的时候约束也比较多,稍显鸡肋。但是比葫芦画瓢的话,还是可以做出一些有用的小工具的。
以上是詳解PHP反射技術的程式碼範例(圖文)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

PHP仍然流行的原因是其易用性、靈活性和強大的生態系統。 1)易用性和簡單語法使其成為初學者的首選。 2)與web開發緊密結合,處理HTTP請求和數據庫交互出色。 3)龐大的生態系統提供了豐富的工具和庫。 4)活躍的社區和開源性質使其適應新需求和技術趨勢。

PHP和Python都是高層次的編程語言,廣泛應用於Web開發、數據處理和自動化任務。 1.PHP常用於構建動態網站和內容管理系統,而Python常用於構建Web框架和數據科學。 2.PHP使用echo輸出內容,Python使用print。 3.兩者都支持面向對象編程,但語法和關鍵字不同。 4.PHP支持弱類型轉換,Python則更嚴格。 5.PHP性能優化包括使用OPcache和異步編程,Python則使用cProfile和異步編程。

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

PHP起源於1994年,由RasmusLerdorf開發,最初用於跟踪網站訪問者,逐漸演變為服務器端腳本語言,廣泛應用於網頁開發。 Python由GuidovanRossum於1980年代末開發,1991年首次發布,強調代碼可讀性和簡潔性,適用於科學計算、數據分析等領域。

PHP適合網頁開發和快速原型開發,Python適用於數據科學和機器學習。 1.PHP用於動態網頁開發,語法簡單,適合快速開發。 2.Python語法簡潔,適用於多領域,庫生態系統強大。

PHP在現代化進程中仍然重要,因為它支持大量網站和應用,並通過框架適應開發需求。 1.PHP7提升了性能並引入了新功能。 2.現代框架如Laravel、Symfony和CodeIgniter簡化開發,提高代碼質量。 3.性能優化和最佳實踐進一步提升應用效率。

PHPhassignificantlyimpactedwebdevelopmentandextendsbeyondit.1)ItpowersmajorplatformslikeWordPressandexcelsindatabaseinteractions.2)PHP'sadaptabilityallowsittoscaleforlargeapplicationsusingframeworkslikeLaravel.3)Beyondweb,PHPisusedincommand-linescrip

PHP類型提示提升代碼質量和可讀性。 1)標量類型提示:自PHP7.0起,允許在函數參數中指定基本數據類型,如int、float等。 2)返回類型提示:確保函數返回值類型的一致性。 3)聯合類型提示:自PHP8.0起,允許在函數參數或返回值中指定多個類型。 4)可空類型提示:允許包含null值,處理可能返回空值的函數。


熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

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

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能

Atom編輯器mac版下載
最受歡迎的的開源編輯器

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