I think this is a code style issue that would not occur if accessor methods were used and the __get and __set methods
were used to throw code style exception indicating the non use of accessor methods as in my framework.
Cheers,
Gerrit.
On 01/11/06, Alexander Veremyev <[EMAIL PROTECTED]> wrote:
Yes. Exactly.
"$this->a[]" is interpreted as "$this->__get('a')[]".
__get() creates 'temporary variable' for returned value (which is an
array) and then [] refers to 'a new element of this array', but doesn't
change original array. This 'temporary variable' is immediately
destroyed after the _expression_ in which it used.
Thus, "$this->a[] = 1" is equal to:
-----
$tempArray = $this->__get('a');
$tempArray[] = 1;
unset($tempArray);
-----
There is the same problem with strings.
I think good way to manage this is an OO wrappers. It works also for
referencing property outside class scope.
PHP5 sends and returns objects "by reference", thus '[]' will work with
the same object instance, which is stored in an object property.
An example is the Zend_Pdf_PHPArray.
With best regards,
Alexander Veremyev.
Matthew Ratzloff wrote:
> I consider this a bug in PHP itself, personally. The solution is
> changing __get to something more like this:
>
> // Zend_View_Abstract::__get()
> public function __get($key)
> {
> if ($key[0] != '_') {
> if (!isset($this->_vars[$key])) {
> $this->_vars[$key] = null;
> }
> return $this->_vars[$key];
> }
> }
>
> This is because when you call $this->a[] = 1, PHP actually calls __get
> instead of __set. There is no warning, error, or anything. It just
> silently fails.
>
> -Matt
>
> ----- Original Message ----- From: "Carolina Feher da Silva"
> < [EMAIL PROTECTED]>
> To: <[email protected]>
> Sent: Tuesday, October 31, 2006 7:32 PM
> Subject: [fw-general] Strange array bug?
>
>
>> Please paste this code in a view:
>>
>> $this->a = array();
>> $this->a[] = 1;
>> print_r($this->a);
>>
>> What do you get? I get an *empty* array. How come? I don't understand it.
>>
>
>
