`
bardo
  • 浏览: 378160 次
  • 性别: Icon_minigender_1
  • 来自: 上海
博客专栏
D1407912-ab64-3e76-ae37-b31aa4afa398
浅述PHP设计模式
浏览量:11803
9d6df9f7-91da-3787-a37c-0e826525dd5d
Zend Framewor...
浏览量:10111
85b628bd-a2ed-3de2-a4b1-0d34985ae8b6
PHP的IDE(集成开发环...
浏览量:9495
社区版块
存档分类
最新评论

在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); //隐私完全暴光

 

         这段代码会输出:

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

 

 

 

0
0
分享到:
评论

相关推荐

    js解析php数组对象数组对象数组对象.docx

    - `every()`: 测试数组中的所有元素是否都满足提供的测试函数。 ```javascript var arr = [1, 2, 3, 4]; var result = arr.every(function (value) { return value &gt; 0; }); console.log(result); // 输出 ...

    经典ASP读取JSON字符串/生成JSON对象,数组对象等。

    这篇关于“经典ASP读取JSON字符串/生成JSON对象,数组对象等”的知识将详细介绍如何在ASP环境中处理JSON数据。 1. **JSON对象与数组的结构**: JSON对象以大括号{}表示,键值对之间用逗号分隔。键必须是字符串,用...

    PHP中把对象数组转换成普通数组的方法

    在PHP开发中,经常需要将对象数组转换成普通数组,尤其是在与外部API接口交互时,接口返回的数据常常是对象数组形式,而业务逻辑中需要以普通数组的方式处理这些数据。本文将详细说明如何在PHP中实现对象数组到普通...

    php数组去重和js数组去重最简方法

    reduce函数累积结果,如果累积器数组已经包含了当前元素,那么不添加,否则将其添加到新数组中。 在实际开发中,选择哪种方法取决于数组大小、性能需求以及兼容性考虑。对于小规模数组,任何方法都适用;对于大规模...

    PHP查询xml,以数组返回

    在`xml.php`和`index.php`文件中,你可以使用上述方法来处理XML数据。例如,`xml.php`可能负责从XML文件中读取数据并将其转换为数组,然后通过HTTP请求传递给`index.php`,后者再根据需要对数据进行操作和展示。 ...

    php的数组操作类.zip

    在使用这个类之前,我们需要先将其解压并引入到我们的PHP脚本中。然后,我们可以创建该类的对象,并调用其提供的方法来执行相应的数组操作。例如: ```php require_once 'php的数组操作类/ArrayHelper.php'; // ...

    PHP数组排序函数合集 以及它们之间的联系分析

    如果数组中包含复杂的对象,可能就需要自定义比较逻辑来满足特定的排序标准。 总结来说,PHP数组排序函数为开发者提供了灵活多样的选择,通过掌握这些函数及其参数的不同组合,可以实现复杂且高效的数据排序操作。...

    PHP中的数组

    如`echo $numbers[2]`将输出数组中的第三个元素(即3)。数组元素可以通过方括号`[]`语法进行检索和修改,如`$numbers[5] = 0`。 2. 关联数组 - 关联数组使用字符串作为索引,这在处理数据库查询结果时尤其有用。...

    jquery 向后台传 数组对象

    在这个场景中,我们特别关注的是如何使用jQuery传递数组对象到后台。下面我们将详细探讨这个主题。 1. **JSON对象与数组** 在JavaScript中,数组是存储一系列值的数据结构,而对象则是一组键值对。为了将数组或...

    php简单对象与数组的转换函数代码(php多层数组和对象的转换)

    本文将详细讲解如何使用自定义函数在PHP中进行对象与数组之间的转换,尤其是处理多层级的数据结构。 首先,让我们分析提供的代码片段。这段代码包含了两个主要的函数:`arrayToObject()` 和 `objectToArray()`。这...

    PHP 数组与Xml转换

    在 PHP 中,数组和 XML 之间的转换是一种常见的需求,特别是在数据交换、存储或者解析 XML 文件时。本篇文章将深入探讨如何在 PHP 中实现数组到 XML 的转换,并提供两种不同的实现方式。 首先,我们来看第一种方法...

    nusoap 创建多维数组

    综上所述,nusoap创建多维数组并结合WebserviceStudio20进行测试,涉及的主要步骤包括:在PHP中创建和操作多维数组,使用nusoap库进行序列化和反序列化,以及在测试工具中模拟请求和解析响应。熟练掌握这些技能,能...

    PHP之数组学习

    与compact()相反的函数是extract(),它可以将数组中的键值对转换为变量,其中键作为变量的名称,值作为变量的值。 除了compact()和extract()之外,array_combine()函数可以用来将两个数组组合成一个新的关联数组,...

    PHP二维数组形成XML内容形式

    在这个场景中,我们将探讨如何使用PHP将二维数组转换为XML内容。 首先,我们需要理解二维数组的基本概念。在PHP中,二维数组是一个数组,其中的每个元素也是一个数组,形如: ```php $array = array( array('key1...

    xml转换数组、对象转数组

    php将对象转成数组,php将xml转成数组 一个自定义函数搞定纯原创。

    php数组使用规则分析

    例如,在数组中使用'apple'作为键,其对应的值可以是任何数据类型。 3. 值的类型:PHP数组的值可以是任意类型的数据,可以是整数、字符串、浮点数、布尔值、NULL,甚至是数组和对象等复杂类型。 4. 简短的数组语法...

    深化理解PHP JSON数组与对象_.docx

    如果需要将一个非连续数字索引的数组强制编码为JSON对象,可以使用`(object)`转换数组为对象,或者在`json_encode`函数中添加`JSON_FORCE_OBJECT`选项: ```php // 强制转换为对象 echo json_encode((object) $non_...

    php数组当链表-php数组和链表的区别总结 数组和链表.pdf

    在计算机科学中,数据结构是组织和管理数据的重要方式,而数组和链表是两种基础且常用的数据结构。在PHP这种编程语言中,理解它们的差异对于优化代码性能至关重要。下面是对PHP数组和链表之间区别的详细解释。 1. *...

    PHP实现数组和对象的相互转换操作示例

    关于php中想让对象以数组的形式访问,这时候就需要使用到get_object_vars()函数了。先来介绍一下这个函数。 官方文档是这样解释的: array get_object_vars ( object $obj ) 返回由 obj 指定的对象中定义的属性...

Global site tag (gtag.js) - Google Analytics