Ⅰ php中怎麼使用ReflectionClass的getMethods方法
你的這個問題完全可以到後盾人那裡解決,那裡有很多相關的視頻教學,我也在那裡學習
Ⅱ 怎麼能通俗易通的了解php中的反射和依賴注入這兩個概念
所謂反射是動態獲取類信息,還能做出修改。比如一些魔術方法 __FUNCTION__,__METHOD__。進階一點可以使用 reflectionClass,就是反射類獲取。
你可以去後盾人平台看看,裡面的東西不錯
Ⅲ php反射在哪些場景有哪些作用
反射是在PHP運行狀態中,擴展分析PHP程序,導出或提取出關於類、方法、屬性、參數等的詳細信息,包括注釋。這種動態獲取的信息以及動態調用對象的方法的功能稱為反射API。反射是操縱面向對象范型中元模型的API,其功能十分強大,可幫助我們構建復雜,可擴展的應用。
其用途如:自動載入插件,自動生成文檔,甚至可用來擴充PHP語言。
php反射api由若干類組成,可幫助我們用來訪問程序的元數據或者同相關的注釋交互。藉助反射我們可以獲取諸如類實現了那些方法,創建一個類的實例(不同於用new創建),調用一個方法(也不同於常規調用),傳遞參數,動態調用類的靜態方法。
反射api是php內建的oop技術擴展,包括一些類,異常和介面,綜合使用他們可用來幫助我們分析其它類,介面,方法,屬性,方法和擴展。這些oop擴展被稱為反射。
通過ReflectionClass,我們可以得到Person類的以下信息:
1)常量 Contants
2)屬性 Property Names
3)方法 Method Names靜態
4)屬性 Static Properties
5)命名空間 Namespace
6)Person類是否為final或者abstract
然後就去看了看thinkphp的源碼,對於MVC的實現也有不同的體驗ThinkPHPLibCoreApp.class.php 中的exec方法
if(!preg_match('/^[A-Za-z](w)*$/',$action)){
//非法操作
thrownewReflectionException();
}
//執行當前操作
$method=newReflectionMethod($mole,$action);#查看方法
if($method->isPublic()){
$class=newReflectionClass($mole);#反射控制器
//前置操作
if($class->hasMethod('_before_'.$action)){
$before=$class->getMethod('_before_'.$action);
if($before->isPublic()){
$before->invoke($mole);
}
}
//URL參數綁定檢測
if(C('URL_PARAMS_BIND')&&$method->getNumberOfParameters()>0){
switch($_SERVER['REQUEST_METHOD']){
case'POST':
$vars=$_POST;
break;
case'PUT':
parse_str(file_get_contents('php://input'),$vars);
break;
default:
$vars=$_GET;
}
$params=$method->getParameters();
foreach($paramsas$param){
$name=$param->getName();
if(isset($vars[$name])){
$args[]=$vars[$name];
}elseif($param->isDefaultValueAvailable()){
$args[]=$param->getDefaultValue();
}else{
throw_exception(L('_PARAM_ERROR_').':'.$name);
}
}
$method->invokeArgs($mole,$args);
}else{
$method->invoke($mole);#執行我們需要調用函數
}
//後置操作
if($class->hasMethod('_after_'.$action)){
$after=$class->getMethod('_after_'.$action);
if($after->isPublic()){
$after->invoke($mole);
}
}
Ⅳ php中怎麼類外訪問私有方法
你問的是私有方法還是私有屬性?
你說的__get __set 是訪問和設置屬性用的。
__call才是訪問方法用的。
但這兩種都需要修改原始類,既然有這個許可權了,那私有方法有什麼必要定義呢?
另外一種獲取私有屬性或調用私有方法的思路是通過反射:
//MyClass這個類中包含了一個名為myFun的私有方法
classMyClass{
private$tmp='hello';
privatefunctionmyFun()
{
echo$this->tmp.''.'world!';
}
}
//通過類名MyClass進行反射
$ref_class=newReflectionClass('MyClass');
//通過反射類進行實例化
$instance=$ref_class->newInstance();
//通過方法名myFun獲取指定方法
$method=$ref_class->getMethod('myFun');
//設置可訪問性
$method->setAccessible(true);
//執行方法
$method->invoke($instance);
//獲取屬性
$property=$ref_class->getProperty('tmp');
//列印屬性
var_mp($property);
不知道你提這個單純是個問題,還是有別的需求,可以多看看php手冊學習一下。
php 訪問控制
php 反射
Ⅳ php中怎麼用ReflectionClass中的方法獲取類信息
$class = new ReflectionClass('ClassName');
//獲取ClassName類的屬性
$class->getProperties()
//獲取ClassName類的方法
$class->getMethods()
Ⅵ php有沒有什麼函數可以獲取一個方法中的參數名和參數類型的
/**
*獲取一個函數的依賴
*@paramstring|callable$func
*@paramarray$param調用方法時所需參數形參名就是key值
*@returnarray返回方法調用所需依賴
*/
functiongetFucntionParameter($func,$param=[]){
if(!is_array($param)){
$param=[$param];
}
$ReflectionFunc=newReflectionFunction($func);
$depend=array();
foreach($ReflectionFunc->getParameters()as$value){
if(isset($param[$value->name])){
$depend[]=$param[$value->name];
}elseif($value->isDefaultValueAvailable()){
$depend[]=$value->getDefaultValue();
}else{
$tmp=$value->getClass();
if(is_null($tmp)){
thrownewException("{$class}");
}
$depend[]=$this->get($tmp->getName());
}
}
return$depend;
}
functiontest($a,$b=20){
echo$a,',',$b;
}
$depend=getFucntionParameter('test',['a'=>30,'b'=>40]);
call_user_func_array('test',$depend);//30,40
上面的函數是我開發的框架的容器的方法。
php提供了很完整的反射機制。不但可以反射函數,還可以反射方法,反射類構造函數。
Ⅶ 如何獲取php一個類中定義的常量
ReflectionClass::getConstants
自己翻手冊。
Ⅷ PHP中有什麼辦法可以列出某個對象所在類聲明的類方法請給出具體核心代碼。
php自身有定義這方面的函數:get_class_methods();返回一個類中所有方法名組成的數組
Ⅸ php 中如何得到一個對象的類型
得到一個對象的類型,使用gettype()函數:
<?php
echogettype(1);//輸出integer
echogettype(array());//輸出array
得到一個對象是哪個類的實例,使用get_class()函數:
<?php
$o=newstdClass();
echoget_class();//輸出stdClass
得到一個類或對象的方法和屬性,要使用反射:
<?php
classMyClass{
public$var;
publicfunctionfoo(){}
}
$ref=newReflectionClass('MyClass');
$ref->getProperties();//會返回一組對象,用法參考PHP手冊
$ref->getMethods();//會返回一組對象,用法參考PHP手冊
$obj=newMyClass();
$ref=newReflectionObject($obj);
$ref->getProperties();
$ref->getMethods();