mirror of
https://github.com/php/php-src.git
synced 2026-03-24 16:22:37 +01:00
Closes GH-8233
This fix corrects a behavior of `var_export()` that was mostly "hidden" until PHP 8.1 introduced:
* properties with object initializers
* constants containing object references
* default values of class properties containing `enum`s
Since `var_export(..., true)` is mostly used in conjunction with code generation,
and we cannot make assumptions about the generated code being placed in the root
namespace, we must always provide the FQCN of a class in exported code.
For example:
```php
<?php
namespace MyNamespace { class Foo {} }
namespace { echo "<?php\n\nnamespace Example;\n\n" . var_export(new \MyNamespace\Foo(), true) . ';'; }
```
produces:
```php
<?php
namespace Example;
MyNamespace\Foo::__set_state(array(
));
```
This code snippet is invalid, because `Example\MyNamespace\Foo::__set_state()` (which
does not exist) is called.
With this patch applied, the code looks like following (valid):
```php
<?php
namespace Example;
\MyNamespace\Foo::__set_state(array(
));
```
Ref: https://github.com/php/php-src/issues/8232
Ref: https://github.com/Ocramius/ProxyManager/issues/754
Ref: https://externals.io/message/117466
25 lines
317 B
PHP
25 lines
317 B
PHP
--TEST--
|
|
var_export() and classes
|
|
--FILE--
|
|
<?php
|
|
class kake {
|
|
public $mann;
|
|
protected $kvinne;
|
|
|
|
function __construct()
|
|
{
|
|
$this->mann = 42;
|
|
$this->kvinne = 43;
|
|
}
|
|
}
|
|
|
|
$kake = new kake;
|
|
|
|
var_export($kake);
|
|
?>
|
|
--EXPECT--
|
|
\kake::__set_state(array(
|
|
'mann' => 42,
|
|
'kvinne' => 43,
|
|
))
|