簡體   English   中英

PHP ArrayAccess設置多維

[英]PHP ArrayAccess set multidimensional

編輯:我意識到文本的數量可能是令人生畏的。 這個問題的實質:
如何以一種使多維值設置成為可能的方式實現ArrayAccess?


我知道這已經在這里討論了,但我似乎無法正確實現ArrayAccess接口。

基本上,我有一個類用數組處理應用程序配置並實現了ArrayAccess 檢索值可以很好地工作,甚至是來自嵌套鍵的值( $port = $config['app']['port']; )。 但是,設置值僅適用於一維數組:只要我嘗試(取消)設置一個值(例如前一個示例中的端口),我就會收到以下錯誤消息:

Notice:  Indirect modification of overloaded element <object name> has no effect in <file> on <line>

現在一般意見似乎是offsetGet()方法必須通過引用返回( &offsetGet() )。 但是,這並沒有解決問題,我擔心我不知道如何正確實現該方法 - 為什么使用getter方法設置值? 這里的php doc也不是很有用。

要直接復制它(PHP 5.4-5.6),請在下面找到示例代碼:

<?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 )。
要將它應用於包含數組的類,請將其結構如下:

<?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);
    }
}

我用這對我的配置庫libconfig ,您可在Github上在MIT許可下。

我不確定這是否有用。 我注意到ArrayObject類是“有趣的”......

我不確定這甚至是一個“答案”。 這是關於這門課程的更多觀察。

它作為標准正確處理'多維數組'的東西。

您可以添加方法,使其更符合您的要求嗎?

<?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']);

輸出:

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM