ID:               32789
 User updated by:  php at thoftware dot de
 Reported By:      php at thoftware dot de
 Status:           Open
 Bug Type:         Arrays related
 Operating System: *
 PHP Version:      4.3.11
 New Comment:

Sorry again, maybe I should stop coding %-(, this is the real 

Actual result:
--------------
it's forever mine
noone else should be able to change it
it's mine
this is my cache

for the example directly above ...


Previous Comments:
------------------------------------------------------------------------

[2005-04-22 15:54:09] php at thoftware dot de

Sorry, the fatal error results from the result of cache() being an
empty array (but that may be another bug?), correct code should be:

Reproduce code:
---------------
class foobar {
  var $cache = array();
  function cache() {
    if (!count($this->cache)) {
      $this->cache[1] = array(
        'this is my cache<br>',
        'it\'s mine<br>',
        'noone else should be able to change it<br>',
        'it\'s forever mine<br>',
      );
    }
    return($this->cache[1]);
  }
}
$foobar =& new foobar();
echo array_pop($foobar->cache());
echo array_pop($foobar->cache());
echo array_pop($foobar->cache());
echo array_pop($foobar->cache());

Expected result:
----------------
it's forever mine 
it's forever mine 
it's forever mine 
it's forever mine

Actual result:
--------------
Fatal error: Only variables can be passed by reference in ...

Using a static variable within the method will work like the example
using a plain function, using an object-variable will work like shown
above, even if you remove the '[1]'-part.

------------------------------------------------------------------------

[2005-04-22 15:46:13] php at thoftware dot de

And again using an object:

Reproduce code:
---------------
class foobar {
  var $cache = array();
  function cache() {
    if (!isset($this->cache)) {
      $this->cache = array(
        'this is my cache<br>',
        'it\'s mine<br>',
        'noone else should be able to change it<br>',
        'it\'s forever mine<br>',
      );
    }
    return($this->cache);
  }
}
$foobar =& new foobar();
echo array_pop($foobar->cache());
echo array_pop($foobar->cache());
echo array_pop($foobar->cache());
echo array_pop($foobar->cache());

Expected result:
----------------
it's forever mine 
it's forever mine 
it's forever mine 
it's forever mine

Actual result:
--------------
Fatal error: Only variables can be passed by reference in ...

Using a static variable within the method will work like the example
using a plain function, using an object-variable causes a fatal error.

------------------------------------------------------------------------

[2005-04-22 15:38:05] php at thoftware dot de

How about this one?

Reproduce code:
---------------
function cache() {
  static $cache=array();
  if (!count($cache)) {
    $cache[1] = array(
      'this is my cache<br>',
      'it\'s mine<br>',
      'noone else should be able to change it<br>',
      'it\'s forever mine<br>',
    );
  }
  return($cache[1]);
}
echo array_pop(cache());
echo array_pop(cache());
echo array_pop(cache());
echo array_pop(cache());

Expected result:
----------------
it's forever mine 
it's forever mine 
it's forever mine 
it's forever mine

Actual result:
--------------
it's forever mine 
noone else should be able to change it 
it's mine 
this is my cache

Note: If you remove the '[1]'-part, it works as expected. I think this
part of the problem is not an array_pop()-bug but a bug within the
reference-system?

------------------------------------------------------------------------

[2005-04-22 14:31:53] php at thoftware dot de

The variables in the object must not be changed! That's the reason why
I don't use &cache()! Either should PHP state that it's not allowed to
use cache() as an argument for array_pop() or array_pop() shouldn't
change the data of the object because cache isn't supposed to return a
reference.

Look at the first example - expected result is an unchanged object
resp. an error-message. The second example was only to show to you,
that PHP recognizes that the method _isn't_ passed as a variable when
it is assigned to a variable before (that's bogus in my eyes).

Why do you make this bug-report bogus? I'm sorry for my maybe bad
english, but is it really not understandable what I'm trying to
explain? Then you may simply take the fact, that

Reproduce code:
---------------
$foobar =& new foobar(); 
echo array_pop($foobar->cache(3)); 
$v = $foobar->cache(3); 
echo $v['time']; 

works in some way, while 

Reproduce code:
---------------
$foobar =& new foobar(); 
$v = $foobar->cache(3); 
echo $v['time']; 
echo array_pop($foobar->cache(3)); 

causes an fatal error and accept this as a bug?

------------------------------------------------------------------------

[2005-04-22 00:04:43] [EMAIL PROTECTED]

This works:

<?php

class foobar {
  var $cache = array();

  function &cache($j) {
    if (!isset($this->cache[$j])) {
      $this->cache[$j] = array(
        'wert' => $j,
        'text' => 'value: '.$j.'<br>',
        'time' => 'set at '.date('h:i:s').'<br>',
      );
    }
    return($this->cache[$j]);
  }
}
$foobar = new foobar();
$v=$foobar->cache(3);
array_pop($foobar->cache(3));
var_dump($foobar->cache(3));

?>

Ask further support questions on [email protected]


------------------------------------------------------------------------

The remainder of the comments for this report are too long. To view
the rest of the comments, please view the bug report online at
    http://bugs.php.net/32789

-- 
Edit this bug report at http://bugs.php.net/?id=32789&edit=1

Reply via email to