PHP实现数组按数组方式访问和对象方式访问

如何实现如下需求:

$data = array('x' => 'xx', 'y' => 'yy');
echo $data['x'];//输出xx
echo $data->x;//输出xx

方法一:构造一个类,实现ArrayAccess接口和__get,__set魔术方法

class Test implements ArrayAccess {
    private $data = null;
    public function __construct($data){
        $this->data = $data;
    }
    public function offsetGet($offset){
        return ($this->offsetExists($offset) ? $this->data[$offset] : null);
    }
    public function offsetSet($offset, $value){
        $this->data[$offset] = $value;
    }
    public function offsetExists($offset){
        return isset($this->data[$offset]);
    }
    public function offsetUnset($offset){
        if($this->offsetExists($offset)){
            unset($this->data[$offset]);
        }
    }
    public function __get($offset){
        return ($this->offsetExists($offset) ? $this->data[$offset] : null);
    }
    public function __set($offset, $value){
        $this->data[$offset] = $value;
    }
}

测试代码

$data = array('x' => 'x', 'y' => 'y');
$t = new Test($data);
printf("数组方式访问(\$t['x'])输出:%s <br />", $t['x']);
printf("对象方式访问(\$t->y)输出:%s <br />", $t->y);
//数组方式赋值,对象方式访问
$t['x1'] = 'x1';
printf("数组方式赋值%s <br />", "\$t['x1']='x1'");
printf("对象方式访问(\$t->x1)输出:%s <br />", $t->x1);
//对象方式赋值,数组方式访问
$t->y1 = 'y1';
printf("对象方式赋值%s <br />", "\$t->y1='y1'");
printf("数组方式访问(\$t['y1'])输出:%s <br />", $t['y1']);

方法二

$data = array('x' => 'x', 'y' => 'y');
$t = new ArrayObject($data, ArrayObject::ARRAY_AS_PROPS);
printf("数组方式访问(\$t['x'])输出:%s <br />", $t['x']);
printf("对象方式访问(\$t->y)输出:%s <br />", $t->y);
//数组方式赋值,对象方式访问
$t['x1'] = 'x1';
printf("数组方式赋值%s <br />", "\$t['x1']='x1'");
printf("对象方式访问(\$t->x1)输出:%s <br />", $t->x1);
//对象方式赋值,数组方式访问
$t->y1 = 'y1';
printf("对象方式赋值%s <br />", "\$t->y1='y1'");
printf("数组方式访问(\$t['y1'])输出:%s <br />", $t['y1']);
测试结果

时间: 2024-07-31 11:50:47

PHP实现数组按数组方式访问和对象方式访问的相关文章

一维数组,二维数组,三维数组,数组与指针,结构体数组,通过改变指针类型改变访问数组的方式

 打印数组中的每个元素,打印每个元素的地址: #include <stdio.h> #include <stdlib.h>   void main(void) {     int a[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };     for (int *p = a; p < a + 10;p++)  //指针类型决定4个字节     {         printf("\n%p,%d", p, *p);    

指针数组和数组指针的详细解答

/**首先弄明白什么是指针数组,什么又是数组指针. 指针数组: 类型名 *数组名[数组长度] 如: int *p[8]; 因为优先级的关系,p先与[]结合,说明p是一个数组,然后再与*结合数组p 的元素是指向整型数据的指针.相当于定义了8个整型指针变量.在此,p就是 数组元素为指针的数组,本质为数组. 数组指针: 类型名 (*指针名)[数组长度] 如:int (*p)[8]; p先与*号结合,形成一个指针,该指针指向的是有8个整型元素的数组, p即为指向数组首元素地址的指针,其本质为指针. **

jquery 遍历数组与数组详细说明

<!doctype html public "-//w3c//dtd xhtml 1.0 transitional//en" "http://www.w3.org/tr/xhtml1/dtd/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="content-

在JavaScript中,如何判断数组是数组?(alpha)

如果你没有注意过这个问题,那么这个标题应该会让你感到困惑,判断数据类型这么基础的问题能有什么坑呢? 少年,你不能太天真了,我们朝夕面对的这门语言,可是JavaScript呀,任何你觉得已经习以为常的东西都可能瞬间转化成一个大坑,令人百思不得其解. 但是正是因为同样的原因,我们可以在学习和使用JavaScript这门语言的时候提出和讨论一些这门语言独有的,十分有趣的问题.比如我们今天要讨论的,在JavaScript当中如何判断一个数组是数组. JavaScript有五种方法可以确定一个值到底是什么

如何执行成功返回字节型数组,数组的内容是一个经过gzip压缩的xml文件

问题描述 请问调用webservice接口,如何在执行成功返回字节型数组,数组的内容是一个经过gzip压缩的xml文件请问这个xml文件怎么去按照我定义的方式去构造,还有这么压缩

指针数组,数组指针,指针函数,函数指针,二级指针详解

先看个简单的:char *p,这定义了一个指针,指针指向的数据类型是字符型,char  *(p)定义了一个指针P: char *p[4], 为指针数组,由于[]的优先级高于*,所以p先和[]结合,p[]是一个数组,暂时把p[]看成是q,也就是char *(q),定义了一个指针q,只不过q是一个数组罢了,故定义了一个数组,数组里面的数据是char *的,所以数组里面的数据为指针类型.所以char *p[4]是四个指针,这四个指针组成了一个数组,称为指针数组,既有多个指针组成的数组. char(*p

c语言,数组,数组名表示首地址

问题描述 c语言,数组,数组名表示首地址 c语言中为什么数组名a和&a的输出结果是一样的,a不是本来就是地址吗 解决方案 应该是a和&a都被编译器解释成数组的首地址了. 解决方案二: 你说的没错,a是表示数组首元素的地址,但是 你要知道它是一个指针常量,即 一个不能被更改的值.对于printf(""%dn""a);和printf(""%dn""&a);,输出的格式是 %d所以有没有&编译器都不做

c++-C++ 6.0读入数组,数组的大小没办法确定

问题描述 C++ 6.0读入数组,数组的大小没办法确定 C++ 6.0读入数组,数组的大小没办法确定,所以希望数组不足的时候对它扩容,是使用memcpy么?但是效率会不会低呢? 解决方案 使用stl中的vector,直接push_back进去 解决方案二: 直接用vector就好啦 解决方案三: 为什么数组的大小不能确定?数组大小在定义时就已经确定了啊.不能确定的是动态数组吧

数组输出-asp.net mvc怎么输出包含数组的数组

问题描述 asp.net mvc怎么输出包含数组的数组 2C 新建了一个model public class User { public User_msg[] msg { get; set; } } public class User_msg { public int id { get; set; } public string[] url { get; set; } } id是在User表中,url在image表中,一个id对应多个image,C#应该怎么写才能让这个数组包含数组的结构完美输出