I have a directory on the webserver in my development environment where I do little experiments. I try out stuff that I cant figure out by looking into the PHP documentation – either because I can’t find the right place to look or because it’s just not explained.
Sadly I need to use that directory quite often. Almost daily.
Today I found this little gem:
$x->y->z = 123; echo $x->y->z;
Without trying, what would you guess what happens when I try to set a value to a property of a property of a variable that I never initialized with an object?
I thought, this would fail and quit with some kind of error message. But no: This script prints “123″.
When I add a print_r($x) to my code I get this:
1 2 3 4 5 6 7 8
stdClass Object ( [y] => stdClass Object ( [z] => 123 ) )
That means that PHP creates an object for me when I try to access properties of a variable that is not set, yet.
So: What happens when the variable HAS a value before I try to set a property?
I have to answer with “Well, that depends…”
- If the variable is NULL or an empty string (!), an object will be auto-generated
- If the variable is numeric (including “0″ (!)) or a string with a length of at least 1 character nothing happens at all. No error message, nothing.
- If the variable already is an object, nothing needs to be done. But note that if the object has no property of the given name, a property is added automatically
I find it quite strange that an empty string seems to be handled the same way as NULL while the numeric value 0 is not.
Another magic behavior uncovered… Let’s see what comes next…