首頁 後端開發 php教程 在PHP中把对象当数组运用

在PHP中把对象当数组运用

Jun 13, 2016 pm 01:07 PM
array name obj void

在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是多少没有查,你要有兴趣可以查一下!

?

?

?

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

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

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

熱工具

記事本++7.3.1

記事本++7.3.1

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

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

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

java中void是什麼意思 java中void是什麼意思 Mar 01, 2023 pm 07:19 PM

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

PHP 中使用 void 類型傳回值有什麼意義? PHP 中使用 void 類型傳回值有什麼意義? Apr 10, 2024 pm 09:21 PM

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

C語言中的void關鍵字的作用 C語言中的void關鍵字的作用 Feb 19, 2024 pm 11:33 PM

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

使用C#中的Array.Sort函數對陣列進行排序 使用C#中的Array.Sort函數對陣列進行排序 Nov 18, 2023 am 10:37 AM

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

如何理解和解決「javascript:void(O)」的問題 如何理解和解決「javascript:void(O)」的問題 Feb 19, 2024 pm 05:35 PM

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

如何使用PHP中的array_combine函數將兩個陣列拼成關聯數組 如何使用PHP中的array_combine函數將兩個陣列拼成關聯數組 Jun 26, 2023 pm 01:41 PM

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

簡單明了的PHP array_merge_recursive()函式使用方法 簡單明了的PHP array_merge_recursive()函式使用方法 Jun 27, 2023 pm 01:48 PM

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

php提交表单通过后,弹出的对话框怎样在当前页弹出,该如何解决 php提交表单通过后,弹出的对话框怎样在当前页弹出,该如何解决 Jun 13, 2016 am 10:23 AM

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

See all articles