目錄
PHP 反射 ReflectionClass,phpreflectionclass
php 怎把反射初始化的对象转换成类的对象
PHP 反射API的问题,急
首頁 php教程 php手册 PHP 反射 ReflectionClass,phpreflectionclass

PHP 反射 ReflectionClass,phpreflectionclass

Jun 13, 2016 am 09:22 AM
初始化

PHP 反射 ReflectionClass,phpreflectionclass

今天遇到了这样一个问题,如下代码:

classA.php

<?php

class ClassA{
	
	public function funcAa(){
	
	}
	
	public function funcAb(){
	
	}
	
	public function funcAc(){
	
	}
}

?>
登入後複製

  

classB.php

<?php

include './classA.php';

class ClassB extends ClassA{

	public function funcBa(){
	
	}

	public function funcBb(){
	
	}

	public function funcBc(){
	
	}
	
	public function funcAa(){
	
		parent::funcAa();
	
	}
	
}

$classB = new ClassB;

$classFuncB = get_class_methods($classB);

echo '<pre class="brush:php;toolbar:false">';

print_r($classFuncB);
?>
登入後複製

当我需要找出ClassB里面的所有方法的时候结果如下:

Array
(
    [0] => funcBa
    [1] => funcBb
    [2] => funcBc
    [3] => funcAa
    [4] => funcAb
    [5] => funcAc
)
登入後複製

一共6个方法,实际上我不想要继承了ClassA里面的方法,我只想要ClassB的方法,怎么办呢?我稍微更改了如下:

$classA = new ClassA;

$classB = new ClassB;

$classFuncA = get_class_methods($classA);

$classFuncB = get_class_methods($classB);

echo '<pre class="brush:php;toolbar:false">';

print_r(array_diff($classFuncB,$classFuncA));
登入後複製

结果如下:

Array
(
    [0] => funcBa
    [1] => funcBb
    [2] => funcBc
)
登入後複製

少了一个方法 funcAa ,虽然funcAa是 ClassB 从 ClassA那里继承过来的,但是同样ClassB也有这个方法,所以不是我想要的结果。

解决方法:

$reflection = new ReflectionClass('ClassB');

print_r($reflection->getMethods());
登入後複製

结果:

Array
(
    [0] => ReflectionMethod Object
        (
            [name] => funcBa
            [class] => ClassB
        )

    [1] => ReflectionMethod Object
        (
            [name] => funcBb
            [class] => ClassB
        )

    [2] => ReflectionMethod Object
        (
            [name] => funcBc
            [class] => ClassB
        )

    [3] => ReflectionMethod Object
        (
            [name] => funcAa
            [class] => ClassB
        )

    [4] => ReflectionMethod Object
        (
            [name] => funcAb
            [class] => ClassA
        )

    [5] => ReflectionMethod Object
        (
            [name] => funcAc
            [class] => ClassA
        )

)
登入後複製

可以看到 [4]、[5] 里面的class 对应的值是ClassA,而其他对应的值都是ClassB。通过这个可以用foreach来实现最后想要的结果:

$reflection = new ReflectionClass('ClassB');

$array = '';

foreach($reflection->getMethods() as $obj){
	
	if($obj->class == $reflection->getName()){	//$reflection->getName()  获取类名
		
		$array[] = $obj->name;
	
	}

}

echo '<pre class="brush:php;toolbar:false">';

print_r($array);
登入後複製

最后结果:

Array
(
    [0] => funcBa
    [1] => funcBb
    [2] => funcBc
    [3] => funcAa
)
登入後複製

完成,关于 ReflectionClass 更多的知识请参考手册

php 怎把反射初始化的对象转换成类的对象

你要确定引入了User类的类定义文件,否则反序列化是不会成功的。
反序列化失败,$user就不会是User对象的实例,也就不会存在方法getModelName了。
 

PHP 反射API的问题,急

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱門文章

倉庫:如何復興隊友
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱門文章

倉庫:如何復興隊友
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱門文章標籤

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

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

Windows 無法初始化此硬體的裝置驅動程式(代碼 37)修復 Windows 無法初始化此硬體的裝置驅動程式(代碼 37)修復 Apr 14, 2023 pm 01:22 PM

Windows 無法初始化此硬體的裝置驅動程式(代碼 37)修復

修正: Windows 無法初始化此硬體的裝置驅動程式 修正: Windows 無法初始化此硬體的裝置驅動程式 Apr 13, 2023 pm 01:19 PM

修正: Windows 無法初始化此硬體的裝置驅動程式

動態連結函式庫初始化例程失敗什麼辦 動態連結函式庫初始化例程失敗什麼辦 Dec 29, 2023 am 10:30 AM

動態連結函式庫初始化例程失敗什麼辦

win7怎麼初始化電腦 win7怎麼初始化電腦 Jan 07, 2024 am 11:53 AM

win7怎麼初始化電腦

修復無法初始化PC上的圖形系統錯誤 修復無法初始化PC上的圖形系統錯誤 Mar 08, 2024 am 09:55 AM

修復無法初始化PC上的圖形系統錯誤

如何重置win7網路設置 如何重置win7網路設置 Dec 26, 2023 pm 06:51 PM

如何重置win7網路設置

C++程式初始化字典 C++程式初始化字典 Sep 09, 2023 pm 07:01 PM

C++程式初始化字典

修復:新 SSD 未在 Windows 11、10 中顯示 修復:新 SSD 未在 Windows 11、10 中顯示 Apr 14, 2023 pm 02:52 PM

修復:新 SSD 未在 Windows 11、10 中顯示

See all articles