我们了解,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是多少没有查,你要有兴趣可以查一下!
分享到:
相关推荐
- `every()`: 测试数组中的所有元素是否都满足提供的测试函数。 ```javascript var arr = [1, 2, 3, 4]; var result = arr.every(function (value) { return value > 0; }); console.log(result); // 输出 ...
这篇关于“经典ASP读取JSON字符串/生成JSON对象,数组对象等”的知识将详细介绍如何在ASP环境中处理JSON数据。 1. **JSON对象与数组的结构**: JSON对象以大括号{}表示,键值对之间用逗号分隔。键必须是字符串,用...
在PHP开发中,经常需要将对象数组转换成普通数组,尤其是在与外部API接口交互时,接口返回的数据常常是对象数组形式,而业务逻辑中需要以普通数组的方式处理这些数据。本文将详细说明如何在PHP中实现对象数组到普通...
reduce函数累积结果,如果累积器数组已经包含了当前元素,那么不添加,否则将其添加到新数组中。 在实际开发中,选择哪种方法取决于数组大小、性能需求以及兼容性考虑。对于小规模数组,任何方法都适用;对于大规模...
在`xml.php`和`index.php`文件中,你可以使用上述方法来处理XML数据。例如,`xml.php`可能负责从XML文件中读取数据并将其转换为数组,然后通过HTTP请求传递给`index.php`,后者再根据需要对数据进行操作和展示。 ...
在使用这个类之前,我们需要先将其解压并引入到我们的PHP脚本中。然后,我们可以创建该类的对象,并调用其提供的方法来执行相应的数组操作。例如: ```php require_once 'php的数组操作类/ArrayHelper.php'; // ...
如果数组中包含复杂的对象,可能就需要自定义比较逻辑来满足特定的排序标准。 总结来说,PHP数组排序函数为开发者提供了灵活多样的选择,通过掌握这些函数及其参数的不同组合,可以实现复杂且高效的数据排序操作。...
如`echo $numbers[2]`将输出数组中的第三个元素(即3)。数组元素可以通过方括号`[]`语法进行检索和修改,如`$numbers[5] = 0`。 2. 关联数组 - 关联数组使用字符串作为索引,这在处理数据库查询结果时尤其有用。...
在这个场景中,我们特别关注的是如何使用jQuery传递数组对象到后台。下面我们将详细探讨这个主题。 1. **JSON对象与数组** 在JavaScript中,数组是存储一系列值的数据结构,而对象则是一组键值对。为了将数组或...
本文将详细讲解如何使用自定义函数在PHP中进行对象与数组之间的转换,尤其是处理多层级的数据结构。 首先,让我们分析提供的代码片段。这段代码包含了两个主要的函数:`arrayToObject()` 和 `objectToArray()`。这...
在 PHP 中,数组和 XML 之间的转换是一种常见的需求,特别是在数据交换、存储或者解析 XML 文件时。本篇文章将深入探讨如何在 PHP 中实现数组到 XML 的转换,并提供两种不同的实现方式。 首先,我们来看第一种方法...
综上所述,nusoap创建多维数组并结合WebserviceStudio20进行测试,涉及的主要步骤包括:在PHP中创建和操作多维数组,使用nusoap库进行序列化和反序列化,以及在测试工具中模拟请求和解析响应。熟练掌握这些技能,能...
与compact()相反的函数是extract(),它可以将数组中的键值对转换为变量,其中键作为变量的名称,值作为变量的值。 除了compact()和extract()之外,array_combine()函数可以用来将两个数组组合成一个新的关联数组,...
在这个场景中,我们将探讨如何使用PHP将二维数组转换为XML内容。 首先,我们需要理解二维数组的基本概念。在PHP中,二维数组是一个数组,其中的每个元素也是一个数组,形如: ```php $array = array( array('key1...
php将对象转成数组,php将xml转成数组 一个自定义函数搞定纯原创。
例如,在数组中使用'apple'作为键,其对应的值可以是任何数据类型。 3. 值的类型:PHP数组的值可以是任意类型的数据,可以是整数、字符串、浮点数、布尔值、NULL,甚至是数组和对象等复杂类型。 4. 简短的数组语法...
如果需要将一个非连续数字索引的数组强制编码为JSON对象,可以使用`(object)`转换数组为对象,或者在`json_encode`函数中添加`JSON_FORCE_OBJECT`选项: ```php // 强制转换为对象 echo json_encode((object) $non_...
在计算机科学中,数据结构是组织和管理数据的重要方式,而数组和链表是两种基础且常用的数据结构。在PHP这种编程语言中,理解它们的差异对于优化代码性能至关重要。下面是对PHP数组和链表之间区别的详细解释。 1. *...
关于php中想让对象以数组的形式访问,这时候就需要使用到get_object_vars()函数了。先来介绍一下这个函数。 官方文档是这样解释的: array get_object_vars ( object $obj ) 返回由 obj 指定的对象中定义的属性...