PHP类和对象函数实例详解
1. interface_exists、class_exists、method_exists和property_exists:
顾名思义,从以上几个函数的命名便可以猜出几分他们的功能。我想这也是我随着对PHP的深入学习而越来越喜欢这门编程语言的原因了吧。下面先给出他们的原型声明和简短说明,更多的还是直接看例子代码吧。
bool interface_exists (string $interface_name [, bool $autoload = true ]) 判断接口是否存在,第二个参数表示在查找时是否执行__autoload。
bool class_exists (string $class_name [, bool $autoload = true ]) 判断类是否存在,第二个参数表示在查找时是否执行__autoload。
bool method_exists (mixed $object , string $method_name) 判断指定类或者对象中是否含有指定的成员函数。
bool property_exists (mixed $class , string $property) 判断指定类或者对象中是否含有指定的成员变量。
<span style="color: #000000;">php </span><strong><span style="color: #008000;">//</span></strong><span style="color: #008000;"><strong>in another_test_class.php</strong></span> <span style="color: #0000ff;">interface</span><span style="color: #000000;"> AnotherTestInterface { } </span><span style="color: #0000ff;">class</span><span style="color: #000000;"> AnotherTestClass { </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">function</span><span style="color: #000000;"> printMe() { </span><span style="color: #0000ff;">print</span> "This is Test2::printSelf.\n"<span style="color: #000000;">; } </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span><span style="color: #000000;"> doSomething() { </span><span style="color: #0000ff;">print</span> "This is Test2::doSomething.\n"<span style="color: #000000;">; } </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> doSomethingWithArgs(<span style="color: #800080;">$arg1</span>, <span style="color: #800080;">$arg2</span><span style="color: #000000;">) { </span><span style="color: #0000ff;">print</span> 'This is Test2::doSomethingWithArgs with ($arg1 = '.<span style="color: #800080;">$arg1</span>.' and $arg2 = '.<span style="color: #800080;">$arg2</span>.").\n"<span style="color: #000000;">; } } </span><span style="color: #000000;">php </span><strong><span style="color: #008000;">//</span></strong><span style="color: #008000;"><strong>in class_exist_test.php,</strong> 下面测试代码中所需的类和接口位于another_test_class.php, //由此可以发现规律,类和接口的名称是驼峰风格的,而文件名的单词间是下划线分隔的。 //这里给出了两种__autoload的方式,因为第一种更为常用和方便,因此我们这里将第二种方式注释掉了,他们之间的差别可以查看manual。</span> <span style="color: #0000ff;">function</span> __autoload(<span style="color: #800080;">$classname</span><span style="color: #000000;">) { </span><span style="color: #800080;">$nomilizedClassname</span> = <span style="color: #008080;">strtolower</span>(<span style="color: #008080;">preg_replace</span>('/([A-Z]\w*)([A-Z]\w*)([A-Z]\w*)/','${1}_${2}_${3}',<span style="color: #800080;">$classname</span><span style="color: #000000;">)); </span><span style="color: #0000ff;">require</span> <span style="color: #008080;">strtolower</span>(<span style="color: #800080;">$nomilizedClassname</span>).".php"<span style="color: #000000;">; } </span><span style="color: #008000;">//</span><span style="color: #008000;">spl_autoload_register(function($classname) { // $nomilizedClassname = strtolower(preg_replace('/([A-Z]\w*)([A-Z]\w*)([A-Z]\w*)/','${1}_${2}_${3}',$classname)); // require strtolower($nomilizedClassname).".php"; //});</span> <span style="color: #0000ff;">print</span> "The following case is tested before executing autoload.\n"<span style="color: #000000;">; </span><span style="color: #0000ff;">if</span> (!<span style="color: #008080;">class_exists</span>('AnotherTestClass',<span style="color: #0000ff;">false</span><span style="color: #000000;">)) { </span><span style="color: #0000ff;">print</span> "This class doesn't exist if no autoload.\n"<span style="color: #000000;">; } </span><span style="color: #0000ff;">if</span> (!<span style="color: #008080;">interface_exists</span>('AnotherTestInterface',<span style="color: #0000ff;">false</span><span style="color: #000000;">)) { </span><span style="color: #0000ff;">print</span> "This interface doesn't exist if no autoload.\n"<span style="color: #000000;">; } </span><span style="color: #0000ff;">print</span> "\nThe following case is tested after executing autoload.\n"<span style="color: #000000;">; </span><span style="color: #0000ff;">if</span> (<span style="color: #008080;">class_exists</span>('AnotherTestClass',<span style="color: #0000ff;">true</span><span style="color: #000000;">)) { </span><span style="color: #0000ff;">print</span> "This class exists if autoload is set to true.\n"<span style="color: #000000;">; } </span><span style="color: #0000ff;">if</span> (<span style="color: #008080;">interface_exists</span>('AnotherTestInterface',<span style="color: #0000ff;">true</span><span style="color: #000000;">)) { </span><span style="color: #0000ff;">print</span> "This interface exists if autoload is set to true.\n"<span style="color: #000000;">; }</span>
运行结果如下:
<span style="color: #000000;">bogon:TestPhp$ php class_exist_test.php The following </span><span style="color: #000000;">case</span><span style="color: #000000;"> is tested before executing autoload. This class doesn</span><span style="color: #800000;">'</span><span style="color: #800000;">t exist if no autoload.</span> This interface doesn<span style="color: #800000;">'</span><span style="color: #800000;">t exist if no autoload.</span> <span style="color: #000000;"> The following </span><span style="color: #000000;">case</span><span style="color: #000000;"> is tested after executing autoload. </span><span style="color: #000000;">This class exists if autoload is set to true. This interface exists if autoload is set to true.</span>
2. get_declared_classes和get_declared_interfaces:
分别返回当前可以访问的所有类和接口,这不仅包括自定义类和接口,也包括了PHP内置类和接口。他们的函数声明非常简单,没有参数,只是返回数组。见如下代码:
<span style="color: #000000;">php </span><span style="color: #0000ff;">interface</span><span style="color: #000000;"> AnotherTestInterface { } </span><span style="color: #0000ff;">class</span><span style="color: #000000;"> AnotherTestClass { </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">function</span><span style="color: #000000;"> printMe() { </span><span style="color: #0000ff;">print</span> "This is Test2::printSelf.\n"<span style="color: #000000;">; } } </span><span style="color: #008080;">print_r</span>(<span style="color: #008080;">get_declared_interfaces</span><span style="color: #000000;">()); </span><span style="color: #008080;">print_r</span>(<span style="color: #008080;">get_declared_classes</span>());
由于输出结果过长,而且这两个函数也比较简单,所以下面就不再给出输出结果了。
3. get_class_methods、get_class_vars和get_object_vars:
这三个函数有一个共同点,即只能获取作用域可见范围内的所有成员函数、成员变量或非静态成员变量。比如在类的内部调用,则所有成员函数或者变量都符合条件,而在类的外部,则只有共有的函数和变量可以返回。
array get_class_methods (mixed $class_name) 获取指定类中可访问的成员函数。
array get_class_vars (string $class_name) 获取指定类中可以访问的成员变量。
array get_object_vars (object $object) 获取可以访问的非静态成员变量。
<span style="color: #000000;">php </span><span style="color: #0000ff;">function</span> output_array(<span style="color: #800080;">$functionName</span>, <span style="color: #800080;">$items</span><span style="color: #000000;">) { </span><span style="color: #0000ff;">print</span> "<span style="color: #800080;">$functionName</span>.....................\n"<span style="color: #000000;">; </span><span style="color: #0000ff;">foreach</span> (<span style="color: #800080;">$items</span> <span style="color: #0000ff;">as</span> <span style="color: #800080;">$key</span> => <span style="color: #800080;">$value</span><span style="color: #000000;">) { </span><span style="color: #0000ff;">print</span> '$key = '.<span style="color: #800080;">$key</span>. ' => $value = '.<span style="color: #800080;">$value</span>."\n"<span style="color: #000000;">; } } </span><span style="color: #0000ff;">class</span><span style="color: #000000;"> TestClass { </span><span style="color: #0000ff;">public</span> <span style="color: #800080;">$publicVar</span> = 1<span style="color: #000000;">; </span><span style="color: #0000ff;">private</span> <span style="color: #800080;">$privateVar</span> = 2<span style="color: #000000;">; </span><span style="color: #0000ff;">static</span> <span style="color: #0000ff;">private</span> <span style="color: #800080;">$staticPrivateVar</span> = "hello"<span style="color: #000000;">; </span><span style="color: #0000ff;">static</span> <span style="color: #0000ff;">public</span> <span style="color: #800080;">$staticPublicVar</span><span style="color: #000000;">; </span><span style="color: #0000ff;">private</span> <span style="color: #0000ff;">function</span><span style="color: #000000;"> privateFunction() { } </span><span style="color: #0000ff;">function</span><span style="color: #000000;"> publicFunction() { output_array(</span>"get_class_methods",<span style="color: #008080;">get_class_methods</span>(<span style="color: #ff00ff;">__CLASS__</span><span style="color: #000000;">)); output_array(</span>'get_class_vars',<span style="color: #008080;">get_class_vars</span>(<span style="color: #ff00ff;">__CLASS__</span><span style="color: #000000;">)); output_array(</span>'get_object_vars',<span style="color: #008080;">get_object_vars</span>(<span style="color: #800080;">$this</span><span style="color: #000000;">)); } } </span><span style="color: #800080;">$testObj</span> = <span style="color: #0000ff;">new</span><span style="color: #000000;"> TestClass(); </span><span style="color: #0000ff;">print</span> "The following is output within TestClass.\n"<span style="color: #000000;">; </span><span style="color: #800080;">$testObj</span>-><span style="color: #000000;">publicFunction(); </span><span style="color: #0000ff;">print</span> "\nThe following is output out of TestClass.\n"<span style="color: #000000;">; output_array(</span>'get_class_methods',<span style="color: #008080;">get_class_methods</span>('TestClass'<span style="color: #000000;">)); output_array(</span>'get_class_vars',<span style="color: #008080;">get_class_vars</span>('TestClass'<span style="color: #000000;">)); output_array(</span>'get_object_vars',<span style="color: #008080;">get_object_vars</span>(<span style="color: #800080;">$testObj</span>));
运行结果如下:
<span style="color: #000000;">bogon:TestPhp liulei$ php class_exist_test.php The following is output within TestClass. get_class_methods..................... $key </span>= <span style="color: #800080;">0</span> => $value =<span style="color: #000000;"> privateFunction $key </span>= <span style="color: #800080;">1</span> => $value =<span style="color: #000000;"> publicFunction get_class_vars..................... $key </span>= publicVar => $value = <span style="color: #800080;">1</span><span style="color: #000000;"> $key </span>= privateVar => $value = <span style="color: #800080;">2</span><span style="color: #000000;"> $key </span>= staticPrivateVar => $value =<span style="color: #000000;"> hello $key </span>= staticPublicVar => $value =<span style="color: #000000;"> get_object_vars..................... $key </span>= publicVar => $value = <span style="color: #800080;">1</span><span style="color: #000000;"> $key </span>= privateVar => $value = <span style="color: #800080;">2</span><span style="color: #000000;"> The following is output out of TestClass. get_class_methods..................... $key </span>= <span style="color: #800080;">0</span> => $value =<span style="color: #000000;"> publicFunction get_class_vars..................... $key </span>= publicVar => $value = <span style="color: #800080;">1</span><span style="color: #000000;"> $key </span>= staticPublicVar => $value =<span style="color: #000000;"> get_object_vars..................... $key </span>= publicVar => $value = <span style="color: #800080;">1</span>
4. get_called_class和get_class:
string get_class ([ object $object = NULL ]) 获取参数对象的类名称。
string get_called_class (void) 静态方法调用时当前的类名称。
<span style="color: #000000;">php </span><span style="color: #0000ff;">class</span><span style="color: #000000;"> Base { </span><span style="color: #0000ff;">static</span> <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span><span style="color: #000000;"> test() { </span><span style="color: #008080;">var_dump</span><span style="color: #000000;">(get_called_class()); } } </span><span style="color: #0000ff;">class</span> Derive <span style="color: #0000ff;">extends</span><span style="color: #000000;"> Base { } Base</span>::<span style="color: #000000;">test(); Derive</span>::<span style="color: #000000;">test(); </span><span style="color: #008080;">var_dump</span>(<span style="color: #008080;">get_class</span>(<span style="color: #0000ff;">new</span><span style="color: #000000;"> Base())); </span><span style="color: #008080;">var_dump</span>(<span style="color: #008080;">get_class</span>(<span style="color: #0000ff;">new</span> Derive()));
运行结果如下:
<span style="color: #000000;">bogon:TestPhp$ php another_test_class.php </span><span style="color: #0000ff;">string</span>(<span style="color: #800080;">4</span>) <span style="color: #800000;">"</span><span style="color: #800000;">Base</span><span style="color: #800000;">"</span> <span style="color: #0000ff;">string</span>(<span style="color: #800080;">6</span>) <span style="color: #800000;">"</span><span style="color: #800000;">Derive</span><span style="color: #800000;">"</span> <span style="color: #0000ff;">string</span>(<span style="color: #800080;">4</span>) <span style="color: #800000;">"</span><span style="color: #800000;">Base</span><span style="color: #800000;">"</span> <span style="color: #0000ff;">string</span>(<span style="color: #800080;">6</span>) <span style="color: #800000;">"</span><span style="color: #800000;">Derive</span><span style="color: #800000;">"</span>
5. get_parent_class、is_a和is_subclass_of:
这三个函数都是和类的继承相关,所以我把他们归到了一起。
string get_parent_class ([ mixed $object ]) 获取参数对象的父类,如果没有父类则返回false。
bool is_a (object $object, string $class_name) 判断第一个参数对象是否是$class_name类本身或是其父类的对象。
bool is_subclass_of (mixed $object, string $class_name) 判断第一个参数对象是否是$class_name的子类。
<span style="color: #000000;">php </span><span style="color: #0000ff;">class</span><span style="color: #000000;"> Base { </span><span style="color: #0000ff;">static</span> <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span><span style="color: #000000;"> test() { </span><span style="color: #008080;">var_dump</span><span style="color: #000000;">(get_called_class()); } } </span><span style="color: #0000ff;">class</span> Derive <span style="color: #0000ff;">extends</span><span style="color: #000000;"> Base { } </span><span style="color: #008080;">var_dump</span>(<span style="color: #008080;">get_parent_class</span>(<span style="color: #0000ff;">new</span><span style="color: #000000;"> Derive())); </span><span style="color: #008080;">var_dump</span>(<span style="color: #008080;">is_a</span>(<span style="color: #0000ff;">new</span> Derive(),'Derive'<span style="color: #000000;">)); </span><span style="color: #008080;">var_dump</span>(<span style="color: #008080;">is_a</span>(<span style="color: #0000ff;">new</span> Derive(),'Base'<span style="color: #000000;">)); </span><span style="color: #008080;">var_dump</span>(<span style="color: #008080;">is_a</span>(<span style="color: #0000ff;">new</span> Base(),'Derive'<span style="color: #000000;">)); </span><span style="color: #008080;">var_dump</span>(<span style="color: #008080;">is_subclass_of</span>(<span style="color: #0000ff;">new</span> Derive(),'Derive'<span style="color: #000000;">)); </span><span style="color: #008080;">var_dump</span>(<span style="color: #008080;">is_subclass_of</span>(<span style="color: #0000ff;">new</span> Derive(),'Base'));
运行结果如下:
<span style="color: #000000;">bogon:TestPhp$ php another_test_class.php </span><span style="color: #000000;">string(4) "Base" bool(true) bool(true) bool(false) bool(false) bool(true)</span>

熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

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

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

Dreamweaver CS6
視覺化網頁開發工具

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

本站6月24日消息,在6月21日HDC2024華為開發者大會主題演講上,華為終端BG軟體部總裁龔體正式官宣了華為自研倉頡程式語言。語言歷經5年研發沉澱,現已開啟開發者預覽。華為開發者官網現已推出倉頡編程語言官方入門教程視頻,方便開發者初步上手理解。教程將帶使用者體驗倉頡、學習倉頡、應用倉頡,包括用倉頡語言估算圓周率、計算2024年各月的干支紀法、看到二叉樹在倉頡語言中的N種表達方式,以及用枚舉類型實現代數計算、用介面和擴充實現訊號系統模擬,還有用倉頡宏擴展出新語法等等。本站附教學存取位址:ht

本站6月21日消息,在今日下午的HDC2024華為開發者大會上,華為終端BG軟體部總裁龔體正式官宣了華為自研倉頡編程語言,並發布了HarmonyOSNEXT倉頡語言開發者預覽版。這是華為首次公開發布倉頡程式語言。龔體表示:「2019年,倉頡程式語言計畫在華為誕生,歷經5年研發沉澱,大量研發投入,今日終於和全球開發者見面。倉頡程式語言透過現代語言特性的整合、全方位的編譯優化和運行時實現、以及開箱即用的IDE工具鏈支持,為開發者打造友好開發體驗和卓越程序性能。

本站6月21日消息,華為自研倉頡程式語言今日正式亮相,官方宣布開啟HarmonyOSNEXT倉頡語言開發者預覽版Beta招募。本次升級為開發者預覽版嚐鮮升級,提供倉頡語言SDK、開發者指南以及相關的DevEcoStudio插件,供開發者使用倉頡語言開發、調試及運行HarmonyOSNext應用。報名週期:2024年6月21日-2024年10月21日申請要求:本次HarmonyOSNEXT倉頡語言開發者預覽版Beta招募活動,僅開放給以下開發者報名:1)已在華為開發者聯盟完成實名認證;2)完成H

本站6月22日消息,華為昨日向全球開發者介紹華為自研程式語言-倉頡(Cangjie)。這是倉頡程式語言的首次公開亮相。本站查詢獲悉,天津大學、北京航空航天大學深度參與了華為「倉頡」的研發。天津大學:倉頡程式語言編譯器天津大學智能與計算學部軟體工程團隊攜手華為倉頡團隊,深度參與倉頡程式語言編譯器的品質保障研究。據介紹,倉頡編譯器是與倉頡程式語言共生的基礎軟體。在倉頡程式語言的籌備階段,與之相匹配的高品質編譯器成為核心目標之一。隨著倉頡程式語言的演化,倉頡編譯器也不斷升級、改進。五年來,天津大

本站6月21日消息,在HDC2024華為開發者大會前,華為自研倉頡程式語言正式亮相,倉頡官網現已上線。官網介紹顯示,倉頡程式語言是一款面向全場景智慧的新一代程式語言,主打「原生智慧化、天生全場景、高效能,強大安全」。融入鴻蒙生態,為開發者提供良好的程式設計體驗。本站附官網介紹如下:原生智慧化內嵌AgentDSL的程式框架,自然語言&程式語言有機融合;多Agent協同,簡化符號表達,模式自由組合,支援各類智慧應用開發。天生全場景輕量化可縮放運行時,模組化分層設計,記憶體再小也能裝得下;全場景領域擴

6月21日消息,今天下午,華為開發者大會2024將正式揭幕。 「純血鴻蒙」HarmonyOSNEXT自然是重中之重,按照餘承東之前透露的規劃,今天下午就可能正式宣佈公測,普通消費者也能嚐鮮「純血鴻蒙」了。據爆料,首批支援的手機為Mate60系列和Pura70系列。值得注意的是,作為“純血鴻蒙”,HarmonyOSNEXT去掉了傳統的Linux核心和AOSP安卓開源程式碼,全端自研。據新浪科技最新報道稱,華為還將補齊鴻蒙生態的最後一環,在大

自2023年3月14日開始,ChatGLM-6B以來,GLM系列模型受到了廣泛的關注與認可。特別是在ChatGLM3-6B開源之後,開發者對智譜AI推出的第四代模型充滿了期待。而這項期待,隨著GLM-4-9B的發布,終於得到了充分的滿足。 GLM-4-9B的誕生為了賦予小模型(10B及以下)更加強大的能力,GLM技術團隊經過近半年的探索,推出了這款全新的第四代GLM系列開源模型:GLM-4-9B。這一模型在確保精度的同時,大幅度壓縮了模型大小,具有更快的推理速度和更高的效率。 GLM技術團隊的探索沒

本站6月21日消息,華為自研倉頡程式語言今日正式亮相,並開啟HarmonyOSNEXT倉頡語言開發者預覽版Beta招募。華為官網倉頡程式語言問答頁面顯示,倉頡程式語言是一款面向全場景智慧的下一代應用程式語言,主打原生智能化,天生全場景,高性能以及強安全,與鴻蒙系統結合,提供良好的編程體驗。面向不同業務場景,鴻蒙生態提供應用開發者倉頡和ArkTS等多語言混合開發能力。倉頡和ArkTS共同發展,在鴻蒙生態中形成優勢互補。倉頡更適合有高效能高並發需求的業務場景,倉頡程式語言目標是打造鴻蒙應用在任務並
