当前位置:首页 > 开发 > 编程语言 > PHP > 正文

在PHP中把对象当数组使用

发表于: 2011-06-06   作者:bardo   来源:转载   浏览次数:
摘要:         我们了解,JAVASCRIPT中,对象的属性、方法,是可以用数组的模式来访问的。但通常情况下是不可能的。         为什么要这么做?这是因为,通过这一方式,可以更加方便地操作对象,我们可以定义一个类。而不是定义一个Key Value数组

        我们了解,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); //隐私完全暴光

 

         这段代码会输出:

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

 

 

 

在PHP中把对象当数组使用

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
在PHP中,数组分为两类:索引数组和关联数组。二者可以单独使用,也可以混合使用。 1、一维数组 一
PHP的数组函数众多,下面是我学习的小结,借此记之,便于以后鉴之……   一、数组定义:   数组
一、数组描述 在现实世界中,数组并不仅仅可以存储像我们以前所描述的基础数据类型,它还可以存储对
定义二维数组 $a[][]=20;//二维数组 $c=array(20,30,[10,80]); echo '<pre>'; print_r($c); s
要多php的多维数组排序,可以使用php里的内置函数:array_multisort(); 语法:array_multisort(array
PHP使用Spreadsheet_Excel_Reader类来读取excel文件 1、首先需要下载该类。下载地址:http://source
redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符
redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符
redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符
redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号