引言
本文我們分享兩個知識點,算是PHP編程中的稍微高階一點的用法,一般不會用到。可是有了這個思路之後,你對於自己的冗餘代碼,應該會有想法了。
獲取函數形參列表
我們在寫程序的時候,不可能所有功能邏輯全堆到一個方法裡。總是要考慮設計方式,重用,以及功能拆分。會細分出許多的函數。
那麼對於一個聲明的函數,類似下面這樣:
function test($name, $age) {}
是否有這樣的函數,可以直接獲取到 test 函數的傳參名呢?
get_func_argNames('test');
輸出類似於:
Array['name','age']
能做到嗎?PHP有這樣的現成函數嗎?很遺憾,沒有!我們需要手動造出來,需要使用一個對象——函數反射 ReflectionFunction。
實現起來代碼如下:
該對象提供 getParameters 方法,返回一個形參列表。使用的之後直接用就是:
print_r(get_func_argNames('get_func_argNames'));
輸出參數數組:
Array( [0] => funcName)
注意,上述方法返回的是全局有效的函數的參數列表,而對於類方法,則需要 ReflectionClass 提供支持了。
驗證是否正確,我們獲取 preg_match 函數的參數列表,輸出如下:
array:5 [ 0 => "pattern" 1 => "subject" 2 => "subpatterns" 3 => "flags" 4 => "offset"]
結果無誤。
類的常量列表
對於一個類,可能源自於多重繼承。那麼對於該類和繼承來的所有常量,我們想要匯總為一個列表,有沒有辦法?
且父類有可能添加或刪除了定義的常量,這個數據是動態的變化的,手動寫死只能是死路一條。
還好,PHP 有反射這個高級語言特性的類,專門用於操作對象。
比如有下面的類:
能否獲取其常量列表,可以是下面三種方式的任意一種:
請問用什麼辦法?
許多優秀的框架在底層設計模式上,幾乎繞不開那個話題——反射。我們對類的操作,也需要反射參與。PHP 提供了 ReflectionClass 用於類操作。
你只需要這麼寫:
$refl = new ReflectionClass('Profile');print_r($refl->getConstants());
輸出的就是所有常量的列表,也就是這種格式:
array('Profile::LABEL_FIRST_NAME' => 'First Name', 'Profile::LABEL_LAST_NAME' => 'Last Name', 'Profile::LABEL_COMPANY_NAME' => 'Company', );
完美解決,幾乎不需要過多解釋。
寫在最後
本文提出的兩個問題,和解決方法,都用到了凌駕於函數和類本身的操作。用於操作函數的類,和操作類的類。為了重用,和壓縮代碼量,你肯定用的著。
Happy coding :-)
我是 @程式設計師小助手 ,持續分享編程知識,歡迎關注。