FUDforum
Fast Uncompromising Discussions. FUDforum will get your users talking.

Home » Imported messages » comp.lang.php » json_decode problem
Show: Today's Messages :: Polls :: Message Navigator
Return to the default flat view Create a new topic Submit Reply
Re: json_decode problem [message #178890 is a reply to message #178888] Mon, 20 August 2012 14:45 Go to previous messageGo to previous message
Thomas 'PointedEars'  is currently offline  Thomas 'PointedEars'
Messages: 701
Registered: October 2010
Karma:
Senior Member
Curtis Dyer wrote:

> Thomas 'PointedEars' Lahn <PointedEars(at)web(dot)de> wrote:
>> FYI: isset() should not be used with properties, because it
>> fails with protected or private properties that have getters:
>>
>> $ php -r 'class Foo { protected $_bar; public function
>> __construct() { $this->_bar = 42; } public function __get($name)
>> { return $this->_bar; } } $x = new Foo(); var_dump($x);
>> var_dump($x->foo); var_dump(isset($x->foo));' object(Foo)#1 (1)
>> {
>> ["_bar":protected]=>
>> int(42)
>> }
>> int(42)
>> bool(false)
>>
>> I have run into this problem recently in an MVC-based commercial
>> application that I had written, where I was accessing a template
>> variable (implemented as item of a protected array property of
>> the view class, accessed with $this->foo). Not using isset() in
>> the template would have saved me hours of debugging.
>> property_exists() would not work either from public context then
>> (it would always return FALSE).
>
> According to the PHP documentation, as of PHP 5.3.0,
> `property_exists()' will also acknowledge protected and private
> properties. [1]

ACK:

$ php -r 'class Foo { private $bar; } var_dump(property_exists(new Foo(),
"bar"));'
bool(true)

$ php -r 'class Foo { private $bar; } var_dump(property_exists(new Foo(),
"baz"));'
bool(false)

$ php -r 'class Foo { protected $bar; } var_dump(property_exists(new Foo(),
"bar"));'
bool(true)

$ php -r 'class Foo { protected $bar; } var_dump(property_exists(new Foo(),
"baz"));'
bool(false)

$ php -v
PHP 5.3.10-1 (cli) (built: Feb 3 2012 10:03:01)
Copyright (c) 1997-2012 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2012 Zend Technologies
with XCache v1.3.2, Copyright (c) 2005-2011, by mOo
with Xdebug v2.1.0, Copyright (c) 2002-2010, by Derick Rethans
with Suhosin v0.9.32.1, Copyright (c) 2007-2010, by SektionEins GmbH

One could consider that an OOP bug. On the other hand, var_dump() also
dumps private and protected properties from public context:

$ php -r 'class Foo { private $bar; } var_dump(new Foo());'object(Foo)#1 (1)
{
["bar":"Foo":private]=>
NULL
}

$ php -r 'class Foo { protected $bar; } var_dump(new Foo());'
object(Foo)#1 (1) {
["bar":protected]=>
NULL
}

Either both functions are OOP-buggy, or none is.

> When using at least PHP 5.1.0, one might also consider PHP
> reflection to check for private and protected properties:
>
> <?php
>
> class Foo {
> private $test;
> }
>
> $r = new ReflectionObject(new Foo());
> var_dump($r->hasProperty('test')); /* bool(true) */
>
> ?>

Overkill in most cases.


PointedEars
--
realism: HTML 4.01 Strict
evangelism: XHTML 1.0 Strict
madness: XHTML 1.1 as application/xhtml+xml
-- Bjoern Hoehrmann
[Message index]
 
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Previous Topic: PEAR Auth package woes
Next Topic: redirect on zend
Goto Forum:
  

-=] Back to Top [=-
[ Syndicate this forum (XML) ] [ RSS ]

Current Time: Fri Sep 20 19:28:48 GMT 2024

Total time taken to generate the page: 0.04813 seconds