Search code examples
phparrayspass-by-referencephp-5.3

PHP array Reference Bug?


With PHP is it even Possible to Pass arrays by Reference ? or its a Bug Only for Me.

class MyStack{
    private $_storage = array();

    public function push(&$elem){//See I am Storing References. Not Copy
        $this->_storage[] = $elem;
    }
    public function pop(){
        return array_pop($this->_storage);
    }
    public function top(){
        return $this->_storage[count($this->_storage)-1];
    }
    public function length(){
        return count($this->_storage);
    }
    public function isEmpty(){
        return ($this->length() == 0);
    }
}
?>
<?php
$stack = new MyStack;
$c = array(0, 1);
$stack->push($c);
$t = $stack->top();
$t[] = 2;
echo count($stack->top());
?>

Expected Result:3 But The Output is: 2


Solution

  • What you probably want is this:

    class MyStack{
        /* ... */
    
        /* Store a non-reference */
        public function push($elem) {
            $this->_storage[] = $elem;
        }
    
        /* return a reference */
        public function &top(){
            return $this->_storage[count($this->_storage)-1];
        }
    
        /* ...*/
    }
    
    /* You must also ask for a reference when calling */
    /* ... */
    $t = &$stack->top();
    $t[] = 2;