在PHP中把对象当数组运用
在PHP中把对象当数组使用
??????? 我们了解,JAVASCRIPT中,对象的属性、方法,是可以用数组的模式来访问的。但通常情况下是不可能的。
??????? 为什么要这么做?这是因为,通过这一方式,可以更加方便地操作对象,我们可以定义一个类。而不是定义一个Key Value数组。自然,如果我们还有其它的办法,一种最简单的,就是强制转换成数组。但,这样会失去对象中原有的方法。
??????? 不过,SPL中的ArrayObject可以帮助我们用数组模式访问属性。但方法仍不能实现。
??????? ArrayObject类结构如下(部分方法是在php5,1或php5.2时才加上的):
ArrayObject implements IteratorAggregate , Traversable , ArrayAccess , Serializable , Countable { /* 常量 */ const integer STD_PROP_LIST = 1 ; const integer ARRAY_AS_PROPS = 2 ; /* 方法 */ __construct ([ mixed $input [, int $flags [, string $iterator_class ]]] ) void append ( mixed $value ) void asort ( void ) int count ( void ) array exchangeArray ( mixed $input ) array getArrayCopy ( void ) int getFlags ( void ) ArrayIterator getIterator ( void ) int getIteratorClass ( void ) void ksort ( void ) void natcasesort ( void ) void natsort ( void ) bool offsetExists ( mixed $index ) mixed offsetGet ( mixed $index ) void offsetSet ( mixed $index , mixed $newval ) void offsetUnset ( mixed $index ) public void serialize ( void ) void setFlags ( int $flags ) void setIteratorClass ( string $iterator_class ) void uasort ( callback $cmp_function ) void uksort ( callback $cmp_function ) public void unserialize ( string $serialized ) }
?
??????? 其中:我们为什么可以用 $obj['name'] 直接访问到 $obj->name呢? 主要是上面的方法中的三个方法:
??????? offsetGet 支持$obj['name'] 读的方式
??????? offsetSet 支持$obj['name'] 写的方式
??????? 但foreach则是该类对ArrayAccess的函数Current等的默认实现。
??????? 看一个例子代码:
class test extends ArrayObject{ public $name; private $age = 21; public function show(){ print_r(get_object_vars($this)); } } class test1{ public $name; private $age = 21; public function show(){ print_r(get_object_vars($this)); } } $obj=new test(); //使用数组方式读写属性 $obj['name']='hello'; $obj['nick']='mockArray'; echo $obj['nick'], '</br>'; var_dump($obj['show']);//检测是否可以访问方法: print_r($obj);//输出对象 $obj->show();//调用方法 $arr=(array)$obj; //强制转换成数组。 print_r($arr); //$arr->show(); 此行将出错,因为,原有方法全部丢失。 $obj1=new test1(); //创建普通对象 $arr1=(array)$obj1; //强制转换成数组。 print_r($arr1); //隐私完全暴光
?
???????? 这段代码会输出:
mockArrayNULL
test Object
(
??? [name] => hello
??? [nick] => mockArray
)
Array
(
??? [name] => hello
??? [nick] => mockArray
)
Array
(
??? [name] => hello
??? [nick] => mockArray
)
Array
(
??? [name] =>
??? [ test1 age] => 21
)
???????? 可以看出,完全可以使用数组模式访问属性,但不能访问到方法(成员函数)。
???????? 强制转换后,即是数组对象,再无成员函数了。
???????? 当然 offsetGet? offsetSet 这两个方法,也可以根据我们的需要进一步改写。为什么?因为,如果有一些十分变态的需求之时,肯定有用。比如,我们要将三个数组用引用的方式包装到一个对象中,当成一个数组来访问。这时,就要重写这两个函数。当然,同时也要重写ArrayAccess接口中对应的函数。
???????? 再有,能够访问到的均是公有属性。如果是私有的,则访问不到的。即便是强制转换成数组,也是一样。但如果没有继承ArrayObject,则就不同了。这样的类,一旦强制转换成数组,其隐私(私有的属性)也就被暴光了。
???????? 不过我们可以看出,私有属性转换成数组以后,未保留原有属性名。而是使用了:某个不可打印字符+类名+不可打印字符+属性名的形式。这个不可打印字符ASCII是多少没有查,你要有兴趣可以查一下!
?
?
?

熱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)

在java中,void是“空”的意思,即“什麼都不返回”,在方法申明的時候表示該方法沒有返回值。 void對應一個包裝類別“java.lang.Void”,該Void類別是用final修飾的,是一個不可實例化的佔位符類,用來保存一個引用代表了Java關鍵字void的Class物件。

在PHP中,void類型傳回值表示函數不傳回任何值,通常用於更新記錄等不需要傳回值的操作。聲明void函數時使用void關鍵字;呼叫void函數時,不得將結果指派給變數。實戰案例:void類型傳回值可用於更新資料庫記錄,無需傳回任何資訊。

C中的void是一個特殊的關鍵字,用來表示空類型,也就是指沒有具體類型的資料。在C語言中,void通常用於以下三個方面。函數傳回類型為void在C語言中,函數可以有不同的回傳類型,例如int、float、char等。然而,如果函數不傳回任何值,則可以將傳回類型設為void。這意味著函數執行完畢後,並不傳回具體的數值。例如:voidhelloWorld()

標題:C#中使用Array.Sort函數對陣列進行排序的範例正文:在C#中,陣列是一種常用的資料結構,經常需要對陣列進行排序運算。 C#提供了Array類,其中有Sort方法可以方便地對陣列進行排序。本文將示範如何使用C#中的Array.Sort函數對陣列進行排序,並提供具體的程式碼範例。首先,我們要先了解Array.Sort函數的基本用法。 Array.So

javascript:void(0)是什麼意思?解決這個問題的方法有哪些?當我們在瀏覽網頁時,有時會遇到一些連結點擊後並沒有任何回應,而在瀏覽器的網址列中卻顯示為"javascript:void(0)"的情況。這個問題可能會讓一些網頁訪客感到困惑,因為他們不知道這個字面上看起來像是JavaScript程式碼的錯誤訊息到底是什麼意思。那麼,就讓我們來一起解開這個

在PHP中,有許多強大的陣列函數可以讓陣列的操作更加方便和快速。當我們需要將兩個陣列拼成一個關聯數組時,可以使用PHP的array_combine函數來實現這一操作。這個函數其實是用來將一個陣列的鍵當作另一個陣列的值,合併成一個新的關聯數組。接下來,我們將會講解如何使用PHP中的array_combine函數將兩個陣列拼成關聯數組。了解array_comb

在進行PHP編程時,我們常常需要將數組合併。 PHP提供了array_merge()函數來完成數組合併的工作,但是當數組中存在相同的鍵時,函數會覆寫原來的值。為了解決這個問題,PHP在語言中還提供了一個array_merge_recursive()函數,該函數可以合併數組並保留相同鍵的值,使得程式的設計變得更加靈活。 array_merge

php提交表单通过后,弹出的对话框怎样在当前页弹出php提交表单通过后,弹出的对话框怎样在当前页弹出而不是在空白页弹出?想实现这样的效果:而不是空白页弹出:------解决方案--------------------如果你的验证用PHP在后端,那么就用Ajax;仅供参考:HTML code
