PHP反射ReflectionClass、ReflectionMethod 入門教程

PHP反射ReflectionClass、ReflectionMethod 入門教程????

作者:SNSGOU?發布于:2014-03-16 16:44:00? 分類:PHP???瀏覽(6145)?

PHP5 具有完整的反射API,添加對類、接口、函數、方法和擴展進行反向工程的能力。

反射是什么?

它是指在PHP運行狀態中,擴展分析PHP程序,導出或提取出關于類、方法、屬性、參數等的詳細信息,包括注釋。這種動態獲取的信息以及動態調用對象的方法的功能稱為反射API。反射是操縱面向對象范型中元模型的API,其功能十分強大,可幫助我們構建復雜,可擴展的應用。

其用途如:自動加載插件,自動生成文檔,甚至可用來擴充PHP語言。

PHP反射api由若干類組成,可幫助我們用來訪問程序的元數據或者同相關的注釋交互。借助反射我們可以獲取諸如類實現了那些方法,創建一個類的實例(不同于用new創建),調用一個方法(也不同于常規調用),傳遞參數,動態調用類的靜態方法。

反射api是PHP內建的OOP技術擴展,包括一些類,異常和接口,綜合使用他們可用來幫助我們分析其它類,接口,方法,屬性,方法和擴展。這些OOP擴展被稱為反射。

?

平常我們用的比較多的是?ReflectionClass類?和?ReflectionMethod類,例如:

01<?php
02class?Person {
03?
04????/**
05?????* For the sake of demonstration, we"re setting this private
06?????*/
07????private?$_allowDynamicAttributes?= false;
08?
09????/**
10?????* type=primary_autoincrement
11?????*/
12????protected?$id?= 0;
13?
14????/**
15?????* type=varchar length=255 null
16?????*/
17????protected?$name;
18?
19????/**
20?????* type=text null
21?????*/
22????protected?$biography;
23?
24????public?function?getId() {
25????????return?$this->id;
26????}
27?
28????public?function?setId($v) {
29????????$this->id =?$v;
30????}
31?
32????public?function?getName() {
33????????return?$this->name;
34????}
35?
36????public?function?setName($v) {
37????????$this->name =?$v;
38????}
39?
40????public?function?getBiography() {
41????????return?$this->biography;
42????}
43?
44????public?function?setBiography($v) {
45????????$this->biography =?$v;
46????}
47}

?

一、通過ReflectionClass,我們可以得到Person類的以下信息:

  1. 常量 Contants
  2. 屬性 Property Names
  3. 方法 Method Names靜態
  4. 屬性 Static Properties
  5. 命名空間 Namespace
  6. Person類是否為final或者abstract
  7. Person類是否有某個方法

接下來反射它,只要把類名"Person"傳遞給ReflectionClass就可以了:

1$class?=?new?ReflectionClass('Person');?// 建立 Person這個類的反射類?
2$instance??=?$class->newInstanceArgs($args);?// 相當于實例化Person 類

?

1)獲取屬性(Properties):

1$properties?=?$class->getProperties();
2foreach?($properties?as?$property) {
3????echo?$property->getName() .?"\n";
4}
5// 輸出:
6// _allowDynamicAttributes
7// id
8// name
9// biography

默認情況下,ReflectionClass會獲取到所有的屬性,private 和 protected的也可以。如果只想獲取到private屬性,就要額外傳個參數:

1$private_properties?=?$class->getProperties(ReflectionProperty::IS_PRIVATE);

可用參數列表:

  • ReflectionProperty::IS_STATIC
  • ReflectionProperty::IS_PUBLIC
  • ReflectionProperty::IS_PROTECTED
  • ReflectionProperty::IS_PRIVATE

通過$property->getName()可以得到屬性名。

?

2)獲取注釋:

通過getDocComment可以得到寫給property的注釋。?

01foreach?($properties?as?$property) {
02????if?($property->isProtected()) {
03????????$docblock?=?$property->getDocComment();
04????????preg_match('/ type\=([a-z_]*) /',?$property->getDocComment(),?$matches);
05????????echo?$matches[1] .?"\n";
06????}
07}
08// Output:
09// primary_autoincrement
10// varchar
11// text

?

3)獲取類的方法

  • getMethods() ? ? ? 來獲取到類的所有methods。
  • hasMethod(string) ?是否存在某個方法
  • getMethod(string) ?獲取方法

?

4)執行類的方法:

1$instance->getName();?// 執行Person 里的方法getName
2// 或者:
3$method?=?$class->getmethod('getName');??// 獲取Person 類中的getName方法
4$method->invoke($instance);??????????????// 執行getName 方法
5// 或者:
6$method?=?$class->getmethod('setName');??// 獲取Person 類中的setName方法
7$method->invokeArgs($instance,?array('snsgou.com'));

?

二、通過ReflectionMethod,我們可以得到Person類的某個方法的信息:

  1. 是否“public”、“protected”、“private” 、“static”類型
  2. 方法的參數列表
  3. 方法的參數個數
  4. 反調用類的方法
1// 執行detail方法
2$method?=?new?ReflectionMethod('Person',?'test');
3?
4if?($method->isPublic() && !$method->isStatic()) {
5????echo?'Action is right';
6}
7echo?$method->getNumberOfParameters();?// 參數個數
8echo?$method->getParameters();?// 參數對象數組

轉載于:https://www.cnblogs.com/lovezbs/p/4435843.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/273306.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/273306.shtml
英文地址,請注明出處:http://en.pswp.cn/news/273306.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Oracle開發常用知識

一、利用游標實現循環嵌套 在對oracle數據進行操作時我們會經常碰到循環甚至循環嵌套的情況。這個時候游標的作用就體現出來了。 DECLAREvId NUMBER(19);vDate DATE;--a表游標定義CURSOR a_cursor ISSELECT DISTINCT o.employeeId FROM operations o WHERE o.employeeId IS N…

條件控制(if ) ( case)

一&#xff1a;IF應用格式 (1)                  (2)                (3) IF 條件 THEN           IF 條件 THEN            IF 條件1 THEN --代碼塊               --代碼塊          …

使用臨時表解決union和order by不能同時使用的問題

最近遇見了這樣一個問題&#xff0c;有4張表&#xff0c;A&#xff08;單據&#xff09;表&#xff0c;B&#xff08;產品&#xff09;表&#xff0c;C&#xff08;產品類型&#xff09;&#xff0c;D&#xff08;單據產品關聯表&#xff09;。 B表有唯一對應的類型C&#xff…

2.3線性表的鏈式存儲和運算—雙向鏈表

以上討論的單鏈表的結點中只有一個指向其后繼結點的指針域next&#xff0c;因此若已知某結點的指針為p&#xff0c;其后繼結點的指針則為p->next &#xff0c;而找其前驅則只能從該鏈表的頭指針開始&#xff0c;順著各結點的next 域進行&#xff0c;也就是說找后繼的時間性能…

Oracle常用字符串操作

參考&#xff1a; 一、oracle操作字符串&#xff1a;拼接、替換、截取、查找&#xff1b; 二、oracle中的trim函數使用介紹 --字符串去空格 --輸出:a b c; SELECT TRIM( a b c ) || ; FROM dual; SELECT TRIM(BOTH FROM a b c ) || ; FROM dual; --輸出: a …

linux下面安裝maven

maven作為最近比較火的項目管理工具&#xff0c;對項目的jar包及其開元添加相應的插件的管理&#xff0c;很方便。 安裝maven&#xff1a; 在官網上面去下載最新的maven的壓縮包&#xff0c;apache-maven-3.3.1-bin.tar.gz. 將下載的壓縮包保存/usr/local/maven下&#xff0c;進…

Hibernate懶加載問題

剛開始接觸這種數據持久化框架時&#xff0c;使用的是Maybatis&#xff0c;相較于最原始的JDBCSQL模式&#xff0c;Maybatis簡直就是神器&#xff0c;特別是在用過Maybatis動態SQL后&#xff0c;簡直就開始對Maybatis愛不釋手。后來工作要求&#xff0c;又接觸到了Hibernate&am…

實現點擊按鈕后,倒計時60秒才能再次點擊

轉載于:https://www.cnblogs.com/liu201312/p/4447710.html

通過棧(Stack)實現對樹的遍歷

說到數的遍歷樹&#xff0c;長期以來的第一印象都是通過遞歸去實現。然而今天看了某位前輩的代碼&#xff0c;才發現使用棧去實現遍歷是那么簡單。理論上通過數組也是可以實現同等功能的&#xff0c;畢竟Stack也是通過數據去實現的。 package com.sysway.ui.widget;import jav…

設計模式_01_單一原則

設計模式_01_單一原則 package designPatternOf_01; /*** 單一原則示例&#xff1a;動物呼吸* 引入的問題&#xff1a;魚不吸空氣&#xff0c;吸水*/ public class SinglePrinciple_01 {public static void main(String[] args) {Animal animalnew Animal();animal.breath(&quo…

StroyBoard中UICollectionView中添加Header和footer

到Storyboard中&#xff0c;選擇collection view controller中的"Collection View"。在Attributes inspector中&#xff0c;選擇"Section Header"和"Section Footer",一旦選中你就會在屏幕中看到下面的的顯示&#xff1a; 最重要的是&#xff0c…

樹形結構數據匯總查詢解決方案+優化求助

最近遇到一個地區數據匯總的問題&#xff0c;地區下的地址呈樹形結構&#xff0c;&#xff08;簡化結構&#xff09;如A市下有B、C區&#xff0c;B區下有D、E街道。先要查詢所有地區的人數&#xff08;包括子區域&#xff09;&#xff0c;如A的人數直屬A的人數B的人數C的人數D的…

find 是區分大小寫的。對于不區分大小寫的寫法(轉載)

轉自&#xff1a;http://justwinit.cn/post/3633/ 默認情況下&#xff0c;find 是區分大小寫的。對于不區分大小寫的 find&#xff0c;將 -iname 測試替換為 -name 測試。find downloads -iname "*.gif"downloads/.xvpics/Calendar05_enlarged.gifdownloads/lcmgcfe…

ORACLE會話以及SQL執行信息查詢

select t.BLOCKING_SESSION,t.SQL_ID,t.SID,t.SERIAL#,t.MACHINE,t.PROGRAM,t.ACTION,t.LOGON_TIME "登錄時間",trunc((sysdate - t.LOGON_TIME) * 24 * 60 * 60) || s "登錄時長",trunc(nvl(s.ELAPSED_TIME / decode(s.EXECUTIONS, 0, 1, s.EXECUTIONS) /…

Dom4j 學習筆記

dom4j 是一種解析 XML 文檔的開放源代碼 XML 框架。dom4j下載地址 本文主要記載了一些簡單的使用方法。 一、xml文件的解析 dom4j既可以解析普通的xml文件&#xff0c;也可以解析一個InputStream&#xff0c;先看看xml文件長什么樣子&#xff1a; <books><book>&l…

交叉連接(CROSS JOIN)的實際應用

一次偶然的機會&#xff0c;使用到了萬年不用的交叉連接&#xff08;CROSS JOIN&#xff09; 業務場景如下&#xff1a; 1、存在多個運營商&#xff0c;每個運營商下面都有各種類型的設備&#xff0c;不同運營商的設備不完全相同&#xff1b; 2、任何設備有且僅有兩種用途‘…

Atitit.操作注冊表 樹形數據庫 注冊表的歷史 java版本類庫總結

Atitit.操作注冊表 樹形數據庫 注冊表的歷史 java版本類庫總結 1. 注冊表是樹形數據庫 1 2. 注冊表的由來 1 3. Java 操作注冊表 2 3.1. 使用Preferences API &#xff08;限定訪問路徑了&#xff09; 2 3.2. 使用JNI 3 3.3. Jregistrykey 推薦 4 3.4. Jregistry 4 4. org.ope…

C# xml文件讀取與修改

c#讀寫xml文件已知有一個XML文件&#xff08;bookstore.xml&#xff09;如下&#xff1a; Code<?xml version"1.0" encoding"gb2312"?><bookstore> <book genre"fantasy" ISBN"2-3631-4"> <title>Obero…

外連接從表過濾

1、使用left join時從表的過濾 WITH a AS( SELECT A aid FROM dual UNION ALL SELECT B FROM dual UNION ALL SELECT C FROM dual UNION ALL SELECT D FROM dual UNION ALL SELECT E FROM dual ), b AS( SELECT A aid,10 num,1 type FROM dual UNION ALL SELECT B,20,2 FROM d…

php pcntl 多進程學習

1、捕獲子進程退出&#xff08;監聽SIGCHLD信號&#xff0c;然后調用 pcntl_wait 函數&#xff09; declare(ticks1);pcntl_signal(SIGCHLD, "sig_handler"); function sig_handler($signo) {switch ($signo) {case SIGCHLD:$status 0;$child_id pcntl_wait($statu…