如何从类外部更改类变量数组?

时间:2014-08-16 20:19:43

标签: php arrays pass-by-reference

我需要从类外部更改一个数组,这是一个类变量。例如,请参阅下面的代码:

<?php
class ArrayRet
{
    private $_ar = array();

    public function __construct()
    {
        $this->_ar['test1'] = 'hello1';
        $this->_ar['test2'] = 'hello2';
    }

    public function getAr()
    {
        return $this->_ar;
    }

    public function dump()
    {
        var_dump($this->_ar);
    }
}

$arRet = new ArrayRet();
$arRet->dump();
$ar = $arRet->getAr();
$ar['test2'] = 'works!!!';
$arRet->dump();
?>

$this->_ar['test2']应为works!!!,但仍为hello2

我怎样才能使这个工作?

编辑:通过更改here找到的语法,它可以正常工作。因此,我们需要将方法更改为:

public function &getAr()
{
   return $this->_ar;
}

还有对此的呼吁:

$ar = &$arRet->getAr();

2 个答案:

答案 0 :(得分:2)

使用当前代码,您不能将ArrayRet::$_ar的可见性声明为private,这意味着无法在类的范围之外访问它。

ArrayRet::$_ar声明为public,您可以执行以下操作...

class ArrayRet
{
    public $_ar = array();
    // ...
}

$arRet = new ArrayRet();
$arRet->_ar['test2'] = 'works!!!';
$arRet->dump();

我不建议直接从类外部修改对象属性,因为这会导致令人头疼。

答案 1 :(得分:2)

你犯了两个错误: 1-您将数组放入$ar并更改了,因此您更改了$ar,而不是$arRet,因此您的对象未更改。 2-您将_ar设置为私有,因此您无法直接更改它,因此您必须创建另一个功能来更改它。有点像:

    <?php
    class ArrayRet
    {
        private $_ar = array();

        public function __construct()
        {
            $this->_ar['test1'] = 'hello1';
            $this->_ar['test2'] = 'hello2';
        }

        public function getAr()
        {
            return $this->_ar;
        }
        public function dump()
        {
            var_dump($this->_ar);
        }
        public function change_var($key,$val)
        {
           $this->_ar[$key] = $val;
        }
    }

    $arRet = new ArrayRet();
    $arRet->dump();
    $arRet->change_var('test1','works!!!');
    $ar = $arRet->getAr();

    $arRet->dump();
var_dump($ar);
    ?>

当您看到$arRet已更改并将其放入$ar时。