<?php
class Foo
{
public function getBar($obj)
{
var_dump($obj->bar);
}
public function getBaz($obj)
{
var_dump($obj->baz);
}
public function getVars($obj)
{
var_dump(get_object_vars($obj));
}
}
$obj = (object) array(
"\0*\0bar" => 1,
"\0Foo\0baz" => 2,
);
// trying `get_object_vars` from global scope
var_dump(get_object_vars($obj));
// trying from Foo instance
(new Foo())->getVars($obj);
// trying from a Foo instance
(new Foo())->getBar($obj);
(new Foo())->getBaz($obj);
// trying from a closure bound to `stdClass`
var_dump(Closure::bind(function ($obj) { var_dump($obj->bar, $obj->baz); }, $obj, 'stdClass')->__invoke($obj));
// trying from a closure bound to `Foo`
var_dump(Closure::bind(function ($obj) { var_dump($obj->bar, $obj->baz); }, $obj, 'Foo')->__invoke($obj));
// direct access (causes fatal)
var_dump($obj->{"\0*\0bar"});
var_dump($obj->{"\0Foo*\0baz"});
array(2) {
[" * bar"]=>
int(1)
[" Foo baz"]=>
int(2)
}
array(2) {
[" * bar"]=>
int(1)
[" Foo baz"]=>
int(2)
}
Warning: Undefined property: stdClass::$bar in /in/UtlEg on line 7
NULL
Warning: Undefined property: stdClass::$baz in /in/UtlEg on line 12
NULL
Warning: Cannot bind closure to scope of internal class stdClass in /in/UtlEg on line 37
Fatal error: Uncaught Error: Call to a member function __invoke() on null in /in/UtlEg:37
Stack trace:
#0 {main}
thrown in /in/UtlEg on line 37
Process exited with code 255.
array(2) {
[" * bar"]=>
int(1)
[" Foo baz"]=>
int(2)
}
array(2) {
[" * bar"]=>
int(1)
[" Foo baz"]=>
int(2)
}
Notice: Undefined property: stdClass::$bar in /in/UtlEg on line 7
NULL
Notice: Undefined property: stdClass::$baz in /in/UtlEg on line 12
NULL
Warning: Cannot bind closure to scope of internal class stdClass in /in/UtlEg on line 37
Fatal error: Uncaught Error: Call to a member function __invoke() on null in /in/UtlEg:37
Stack trace:
#0 {main}
thrown in /in/UtlEg on line 37
Process exited with code 255.
Output for 7.3.32 - 7.3.33
array(2) {
[" * bar"]=>
int(1)
[" Foo baz"]=>
int(2)
}
array(2) {
[" * bar"]=>
int(1)
[" Foo baz"]=>
int(2)
}
NULL
NULL
Warning: Cannot bind closure to scope of internal class stdClass in /in/UtlEg on line 37
Fatal error: Uncaught Error: Call to a member function __invoke() on null in /in/UtlEg:37
Stack trace:
#0 {main}
thrown in /in/UtlEg on line 37
Process exited with code 255.
array(1) {
["bar"]=>
int(1)
}
array(1) {
["bar"]=>
int(1)
}
Notice: Undefined property: stdClass::$bar in /in/UtlEg on line 7
NULL
Notice: Undefined property: stdClass::$baz in /in/UtlEg on line 12
NULL
Notice: Undefined property: stdClass::$bar in /in/UtlEg on line 37
Notice: Undefined property: stdClass::$baz in /in/UtlEg on line 37
NULL
NULL
NULL
Notice: Undefined property: stdClass::$bar in /in/UtlEg on line 40
Notice: Undefined property: stdClass::$baz in /in/UtlEg on line 40
NULL
NULL
NULL
Fatal error: Cannot access property started with '\0' in /in/UtlEg on line 43
Process exited with code 255.
Parse error: syntax error, unexpected T_OBJECT_OPERATOR in /in/UtlEg on line 30
Process exited with code 255.
Output for 5.0.0 - 5.0.5
Parse error: parse error, unexpected T_OBJECT_OPERATOR in /in/UtlEg on line 30
Process exited with code 255.
Output for 4.4.2 - 4.4.9
Parse error: syntax error, unexpected T_STRING, expecting T_OLD_FUNCTION or T_FUNCTION or T_VAR or '}' in /in/UtlEg on line 5
Process exited with code 255.
Parse error: parse error, unexpected T_STRING, expecting T_OLD_FUNCTION or T_FUNCTION or T_VAR or '}' in /in/UtlEg on line 5
Process exited with code 255.
Output for 4.3.2 - 4.3.4
Parse error: parse error, expecting `T_OLD_FUNCTION' or `T_FUNCTION' or `T_VAR' or `'}'' in /in/UtlEg on line 5
Process exited with code 255.