首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP ArrayObject内部工作原理

PHP ArrayObject内部工作原理
EN

Stack Overflow用户
提问于 2012-02-08 06:28:58
回答 1查看 947关注 0票数 3

在哪里可以找到ArrayObject的完整源代码( PHP)?

我不明白的是,为什么在向ArrayObject添加元素时可以使用“箭头”,例如:

代码语言:javascript
复制
$a = new ArrayObject();
$a['arr'] = 'array data';                             
$a->prop = 'prop data';  //here it is

您可以看到使用了$a->prop = 'prop data';

有没有什么神奇的方法或者使用了什么,以及PHP是如何知道例如$a['prop']$a->prop的意思相同的?(在此上下文中)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-02-08 06:31:19

是的,它是神奇的,可以直接在PHP中完成。查看重载 http://www.php.net/manual/en/language.oop5.overloading.php

您可以在类中使用__get()__set来完成此操作。要使对象的行为类似于数组,您必须实现http://www.php.net/manual/en/class.arrayaccess.php

这是我的示例代码:

代码语言:javascript
复制
<?php
class MyArrayObject implements Iterator, ArrayAccess, Countable
{
    /**  Location for overloaded data.  */
    private $_data = array();

    public function __set($name, $value)
    {
        $this->_data[$name] = $value;
    }

    public function __get($name)
    {
        if (array_key_exists($name, $this->_data)) {
            return $this->_data[$name];
        }

        $trace = debug_backtrace();
        trigger_error(
            'Undefined property via __get(): ' . $name .
            ' in ' . $trace[0]['file'] .
            ' on line ' . $trace[0]['line'],
            E_USER_NOTICE);
        return null;
    }

    /**  As of PHP 5.1.0  */
    public function __isset($name)
    {
        return isset($this->_data[$name]);
    }

    /**  As of PHP 5.1.0  */
    public function __unset($name)
    {
        unset($this->_data[$name]);
    }

    public function offsetSet($offset, $value) {
        if (is_null($offset)) {
            $this->_data[] = $value;
        } else {
            $this->_data[$offset] = $value;
        }
    }

    public function offsetExists($offset) {
        return isset($this->_data[$offset]);
    }

    public function offsetUnset($offset) {
        unset($this->_data[$offset]);
    }

    public function offsetGet($offset) {
        return isset($this->_data[$offset]) ? $this->_data[$offset] : null;
    }
    public function count(){
        return count($this->_data);
    }
    public function current(){
        return current($this->_data);
    }
    public function next(){
        return next($this->_data);
    }
    public function key(){
        return key($this->_data);
    }
    public function valid(){
        return key($this->_data) !== null;
    }
    public function rewind(){
        reset($this->_data);
    }
}

next($a)使用$a->current()$a->next()而不是current($a)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9184999

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档