首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP ArrayAccess集多维集

PHP ArrayAccess集多维集
EN

Stack Overflow用户
提问于 2015-04-05 16:17:54
回答 1查看 925关注 0票数 3

编辑:我意识到文本的数量可能很吓人。这个问题的实质是:

如何实现ArrayAccess,使设置多维值成为可能?

我知道这里已经讨论过这一点,但是我似乎无法正确地实现ArrayAccess接口。

基本上,我有一个用数组处理应用程序配置的类,并实现了ArrayAccess。检索值很好,甚至可以从嵌套键($port = $config['app']['port'];)中检索值。但是,设置值只适用于一维数组:只要我尝试(Un)设置一个值(例如。上一个例子中的端口),我得到以下错误消息:

代码语言:javascript
复制
Notice:  Indirect modification of overloaded element <object name> has no effect in <file> on <line>

现在,人们似乎普遍认为,offsetGet()方法必须通过引用返回(&offsetGet())。然而,这并不能解决问题,恐怕我不知道如何正确地实现该方法--为什么会使用getter方法来设置值?php 这里也没有多大帮助。

为了直接复制这一点(PHP5.4-5.6),请找到下面所附的示例代码:

代码语言:javascript
复制
<?php

class Config implements \ArrayAccess
{

    private $data = array();

    public function __construct($data)
    {
        $this->data = $data;
    }


    /**
     * ArrayAccess Interface
     * 
     */
    public function offsetSet($offset, $value)
    {
        if (is_null($offset)) {
            $this->data[] = $value;
        } else {
            $this->data[$offset] = $value;
        }
    }

    public function &offsetGet($offset)
    {       
        return isset($this->data[$offset]) ? $this->data[$offset] : null;
    }

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

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

$conf = new Config(array('a' => 'foo', 'b' => 'bar', 'c' => array('sub' => 'baz')));
$conf['c']['sub'] = 'notbaz';

编辑2: --正如Ryan指出的那样,解决方案是使用ArrayObject (已经实现了ArrayAccessCountableIteratorAggregate)。

若要将其应用于包含数组的类,请将其结构如下:

代码语言:javascript
复制
<?php

class Config extends \ArrayObject
{

    private $data = array();

    public function __construct($data)
    {
        $this->data = $data;
        parent::__construct($this->data);
    }


    /**
     * Iterator Interface
     *
     */
    public function getIterator() {
        return new \ArrayIterator($this->data);
    }

    /**
     * Count Interface
     *
     */
    public function count()
    {
        return count($this->data);
    }
}

我使用这个作为我的Config库libconfig,它可以在麻省理工学院许可下在Github上使用。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-07 16:04:18

我不知道这是否有用。我注意到ArrayObject类很“有趣”.

我不知道这是否一个“答案”。这更像是对这门课的观察。

它按照标准正确地处理“多维数组”内容。

您可能会添加一些方法来使它做更多您想做的事情?

代码语言:javascript
复制
<?php //

class Config extends \ArrayObject
{

//    private $data = array();

    public function __construct(array $data = array())
    {
        parent::__construct($data);
    }
}

$conf = new Config(array('a' => 'foo', 'b' => 'bar', 'c' => array('sub' => 'baz')));
$conf['c']['sub'] = 'notbaz';
$conf['c']['sub2'] = 'notbaz2';

var_dump($conf, $conf['c'], $conf['c']['sub']);

unset($conf['c']['sub']);

var_dump('isset?: ', isset($conf['c']['sub']));

var_dump($conf, $conf['c'], $conf['c']['sub2']);

输出:

代码语言:javascript
复制
object(Config)[1]
  public 'a' => string 'foo' (length=3)
  public 'b' => string 'bar' (length=3)
  public 'c' => 
    array
      'sub' => string 'notbaz' (length=6)
      'sub2' => string 'notbaz2' (length=7)

array
  'sub' => string 'notbaz' (length=6)
  'sub2' => string 'notbaz2' (length=7)

string 'notbaz' (length=6)

string 'isset?: ' (length=8)

boolean false

object(Config)[1]
  public 'a' => string 'foo' (length=3)
  public 'b' => string 'bar' (length=3)
  public 'c' => 
    array
      'sub2' => string 'notbaz2' (length=7)

array
  'sub2' => string 'notbaz2' (length=7)

string 'notbaz2' (length=7)
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29459399

复制
相关文章

相似问题

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