Skip to content

Commit 52d28ad

Browse files
committed
Fix php#8232 - always reference classes in var_export() via their FQCN
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: php#8232 Ref: Ocramius/ProxyManager#754
1 parent 21b0da8 commit 52d28ad

20 files changed

+312
-283
lines changed

Zend/tests/bug73350.phpt

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ $e = new Exception();
1212
var_export($e);
1313
?>
1414
--EXPECTF--
15-
Exception::__set_state(array(
15+
\Exception::__set_state(array(
1616
'message' => '',
1717
'string' => 'Exception in %sbug73350.php:%d
1818
Stack trace:
+28
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
--TEST--
2+
Enum in var_export()
3+
--FILE--
4+
<?php
5+
6+
namespace {
7+
enum Foo { case BAR; }
8+
}
9+
10+
namespace A {
11+
enum Foo { case BAR; }
12+
}
13+
14+
namespace A\B {
15+
enum Foo { case BAR; }
16+
}
17+
18+
namespace Test {
19+
echo var_export(\Foo::BAR, true) . "\n";
20+
echo var_export(\A\Foo::BAR, true) . "\n";
21+
echo var_export(\A\B\Foo::BAR, true) . "\n";
22+
}
23+
24+
?>
25+
--EXPECT--
26+
\Foo::BAR
27+
\A\Foo::BAR
28+
\A\B\Foo::BAR

Zend/tests/enum/var_export.phpt

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,5 +17,5 @@ echo str_replace(" \n", "\n", var_export([Foo::Bar], true));
1717
Foo::Bar
1818
array (
1919
0 =>
20-
Foo::Bar,
20+
\Foo::Bar,
2121
)

ext/date/tests/bug52113.phpt

+2-2
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ $diff_un = unserialize($diff_s);
1616
$p = new DatePeriod($start, $diff_un, 2);
1717
var_dump($diff_un, $p);
1818

19-
$unser = DateInterval::__set_state(array(
19+
$unser = \DateInterval::__set_state(array(
2020
'y' => 7,
2121
'm' => 6,
2222
'd' => 5,
@@ -68,7 +68,7 @@ object(DateInterval)#%d (16) {
6868
int(0)
6969
}
7070
string(332) "O:12:"DateInterval":16:{s:1:"y";i:0;s:1:"m";i:0;s:1:"d";i:0;s:1:"h";i:4;s:1:"i";i:0;s:1:"s";i:0;s:1:"f";d:0;s:7:"weekday";i:0;s:16:"weekday_behavior";i:0;s:17:"first_last_day_of";i:0;s:6:"invert";i:0;s:4:"days";i:0;s:12:"special_type";i:0;s:14:"special_amount";i:0;s:21:"have_weekday_relative";i:0;s:21:"have_special_relative";i:0;}"
71-
DateInterval::__set_state(array(
71+
\DateInterval::__set_state(array(
7272
'y' => 0,
7373
'm' => 0,
7474
'd' => 0,

ext/intl/tests/dateformat_format.phpt

+10-10
Original file line numberDiff line numberDiff line change
@@ -318,79 +318,79 @@ Formatted localtime_array is : 12/17/95 12:13 AM
318318
IntlDateFormatter locale= en_US ,datetype = -1 ,timetype =-1
319319
Formatted localtime_array is : 18951217 12:13 AM
320320
------------
321-
Date is: DateTime::__set_state(array(
321+
Date is: \DateTime::__set_state(array(
322322
'date' => '2010-01-01 01:02:03.000000',
323323
'timezone_type' => 3,
324324
'timezone' => 'UTC',
325325
))
326326
------------
327327
Formatted DateTime is : Thursday, December 31, 2009 3:02:03 PM GMT-10:00
328328
------------
329-
Date is: DateTime::__set_state(array(
329+
Date is: \DateTime::__set_state(array(
330330
'date' => '2010-01-01 01:02:03.000000',
331331
'timezone_type' => 3,
332332
'timezone' => 'UTC',
333333
))
334334
------------
335335
Formatted DateTime is : December 31, 2009 3:02:03 PM GMT-10:00
336336
------------
337-
Date is: DateTime::__set_state(array(
337+
Date is: \DateTime::__set_state(array(
338338
'date' => '2010-01-01 01:02:03.000000',
339339
'timezone_type' => 3,
340340
'timezone' => 'UTC',
341341
))
342342
------------
343343
Formatted DateTime is : Dec 31, 2009 3:02:03 PM
344344
------------
345-
Date is: DateTime::__set_state(array(
345+
Date is: \DateTime::__set_state(array(
346346
'date' => '2010-01-01 01:02:03.000000',
347347
'timezone_type' => 3,
348348
'timezone' => 'UTC',
349349
))
350350
------------
351351
Formatted DateTime is : 12/31/09 3:02 PM
352352
------------
353-
Date is: DateTime::__set_state(array(
353+
Date is: \DateTime::__set_state(array(
354354
'date' => '2010-01-01 01:02:03.000000',
355355
'timezone_type' => 3,
356356
'timezone' => 'UTC',
357357
))
358358
------------
359359
Formatted DateTime is : 20091231 03:02 PM
360360
------------
361-
Date is: DateTime::__set_state(array(
361+
Date is: \DateTime::__set_state(array(
362362
'date' => '2000-12-30 19:04:05.000000',
363363
'timezone_type' => 2,
364364
'timezone' => 'PDT',
365365
))
366366
------------
367367
Formatted DateTime is : Saturday, December 30, 2000 5:04:05 PM GMT-10:00
368368
------------
369-
Date is: DateTime::__set_state(array(
369+
Date is: \DateTime::__set_state(array(
370370
'date' => '2000-12-30 19:04:05.000000',
371371
'timezone_type' => 2,
372372
'timezone' => 'PDT',
373373
))
374374
------------
375375
Formatted DateTime is : December 30, 2000 5:04:05 PM GMT-10:00
376376
------------
377-
Date is: DateTime::__set_state(array(
377+
Date is: \DateTime::__set_state(array(
378378
'date' => '2000-12-30 19:04:05.000000',
379379
'timezone_type' => 2,
380380
'timezone' => 'PDT',
381381
))
382382
------------
383383
Formatted DateTime is : Dec 30, 2000 5:04:05 PM
384384
------------
385-
Date is: DateTime::__set_state(array(
385+
Date is: \DateTime::__set_state(array(
386386
'date' => '2000-12-30 19:04:05.000000',
387387
'timezone_type' => 2,
388388
'timezone' => 'PDT',
389389
))
390390
------------
391391
Formatted DateTime is : 12/30/00 5:04 PM
392392
------------
393-
Date is: DateTime::__set_state(array(
393+
Date is: \DateTime::__set_state(array(
394394
'date' => '2000-12-30 19:04:05.000000',
395395
'timezone_type' => 2,
396396
'timezone' => 'PDT',

ext/intl/tests/dateformat_format_variant2.phpt

+10-10
Original file line numberDiff line numberDiff line change
@@ -318,79 +318,79 @@ Formatted localtime_array is : 12/17/95, 12:13 AM
318318
IntlDateFormatter locale= en_US ,datetype = -1 ,timetype =-1
319319
Formatted localtime_array is : 18951217 12:13 AM
320320
------------
321-
Date is: DateTime::__set_state(array(
321+
Date is: \DateTime::__set_state(array(
322322
'date' => '2010-01-01 01:02:03.000000',
323323
'timezone_type' => 3,
324324
'timezone' => 'UTC',
325325
))
326326
------------
327327
Formatted DateTime is : Thursday, December 31, 2009 at 3:02:03 PM GMT-10:00
328328
------------
329-
Date is: DateTime::__set_state(array(
329+
Date is: \DateTime::__set_state(array(
330330
'date' => '2010-01-01 01:02:03.000000',
331331
'timezone_type' => 3,
332332
'timezone' => 'UTC',
333333
))
334334
------------
335335
Formatted DateTime is : December 31, 2009 at 3:02:03 PM GMT-10
336336
------------
337-
Date is: DateTime::__set_state(array(
337+
Date is: \DateTime::__set_state(array(
338338
'date' => '2010-01-01 01:02:03.000000',
339339
'timezone_type' => 3,
340340
'timezone' => 'UTC',
341341
))
342342
------------
343343
Formatted DateTime is : Dec 31, 2009, 3:02:03 PM
344344
------------
345-
Date is: DateTime::__set_state(array(
345+
Date is: \DateTime::__set_state(array(
346346
'date' => '2010-01-01 01:02:03.000000',
347347
'timezone_type' => 3,
348348
'timezone' => 'UTC',
349349
))
350350
------------
351351
Formatted DateTime is : 12/31/09, 3:02 PM
352352
------------
353-
Date is: DateTime::__set_state(array(
353+
Date is: \DateTime::__set_state(array(
354354
'date' => '2010-01-01 01:02:03.000000',
355355
'timezone_type' => 3,
356356
'timezone' => 'UTC',
357357
))
358358
------------
359359
Formatted DateTime is : 20091231 03:02 PM
360360
------------
361-
Date is: DateTime::__set_state(array(
361+
Date is: \DateTime::__set_state(array(
362362
'date' => '2000-12-30 19:04:05.000000',
363363
'timezone_type' => 3,
364364
'timezone' => 'America/Los_Angeles',
365365
))
366366
------------
367367
Formatted DateTime is : Saturday, December 30, 2000 at 5:04:05 PM GMT-10:00
368368
------------
369-
Date is: DateTime::__set_state(array(
369+
Date is: \DateTime::__set_state(array(
370370
'date' => '2000-12-30 19:04:05.000000',
371371
'timezone_type' => 3,
372372
'timezone' => 'America/Los_Angeles',
373373
))
374374
------------
375375
Formatted DateTime is : December 30, 2000 at 5:04:05 PM GMT-10
376376
------------
377-
Date is: DateTime::__set_state(array(
377+
Date is: \DateTime::__set_state(array(
378378
'date' => '2000-12-30 19:04:05.000000',
379379
'timezone_type' => 3,
380380
'timezone' => 'America/Los_Angeles',
381381
))
382382
------------
383383
Formatted DateTime is : Dec 30, 2000, 5:04:05 PM
384384
------------
385-
Date is: DateTime::__set_state(array(
385+
Date is: \DateTime::__set_state(array(
386386
'date' => '2000-12-30 19:04:05.000000',
387387
'timezone_type' => 3,
388388
'timezone' => 'America/Los_Angeles',
389389
))
390390
------------
391391
Formatted DateTime is : 12/30/00, 5:04 PM
392392
------------
393-
Date is: DateTime::__set_state(array(
393+
Date is: \DateTime::__set_state(array(
394394
'date' => '2000-12-30 19:04:05.000000',
395395
'timezone_type' => 3,
396396
'timezone' => 'America/Los_Angeles',

ext/intl/tests/dateformat_format_variant3.phpt

+10-10
Original file line numberDiff line numberDiff line change
@@ -318,79 +318,79 @@ Formatted localtime_array is : 12/17/95, 12:13 AM
318318
IntlDateFormatter locale= en_US ,datetype = -1 ,timetype =-1
319319
Formatted localtime_array is : 18951217 12:13 AM
320320
------------
321-
Date is: DateTime::__set_state(array(
321+
Date is: \DateTime::__set_state(array(
322322
'date' => '2010-01-01 01:02:03.000000',
323323
'timezone_type' => 3,
324324
'timezone' => 'UTC',
325325
))
326326
------------
327327
Formatted DateTime is : Thursday, December 31, 2009 at 3:02:03 PM GMT-10:00
328328
------------
329-
Date is: DateTime::__set_state(array(
329+
Date is: \DateTime::__set_state(array(
330330
'date' => '2010-01-01 01:02:03.000000',
331331
'timezone_type' => 3,
332332
'timezone' => 'UTC',
333333
))
334334
------------
335335
Formatted DateTime is : December 31, 2009 at 3:02:03 PM GMT-10
336336
------------
337-
Date is: DateTime::__set_state(array(
337+
Date is: \DateTime::__set_state(array(
338338
'date' => '2010-01-01 01:02:03.000000',
339339
'timezone_type' => 3,
340340
'timezone' => 'UTC',
341341
))
342342
------------
343343
Formatted DateTime is : Dec 31, 2009, 3:02:03 PM
344344
------------
345-
Date is: DateTime::__set_state(array(
345+
Date is: \DateTime::__set_state(array(
346346
'date' => '2010-01-01 01:02:03.000000',
347347
'timezone_type' => 3,
348348
'timezone' => 'UTC',
349349
))
350350
------------
351351
Formatted DateTime is : 12/31/09, 3:02 PM
352352
------------
353-
Date is: DateTime::__set_state(array(
353+
Date is: \DateTime::__set_state(array(
354354
'date' => '2010-01-01 01:02:03.000000',
355355
'timezone_type' => 3,
356356
'timezone' => 'UTC',
357357
))
358358
------------
359359
Formatted DateTime is : 20091231 03:02 PM
360360
------------
361-
Date is: DateTime::__set_state(array(
361+
Date is: \DateTime::__set_state(array(
362362
'date' => '2000-12-30 19:04:05.000000',
363363
'timezone_type' => 2,
364364
'timezone' => 'PDT',
365365
))
366366
------------
367367
Formatted DateTime is : Saturday, December 30, 2000 at 5:04:05 PM GMT-10:00
368368
------------
369-
Date is: DateTime::__set_state(array(
369+
Date is: \DateTime::__set_state(array(
370370
'date' => '2000-12-30 19:04:05.000000',
371371
'timezone_type' => 2,
372372
'timezone' => 'PDT',
373373
))
374374
------------
375375
Formatted DateTime is : December 30, 2000 at 5:04:05 PM GMT-10
376376
------------
377-
Date is: DateTime::__set_state(array(
377+
Date is: \DateTime::__set_state(array(
378378
'date' => '2000-12-30 19:04:05.000000',
379379
'timezone_type' => 2,
380380
'timezone' => 'PDT',
381381
))
382382
------------
383383
Formatted DateTime is : Dec 30, 2000, 5:04:05 PM
384384
------------
385-
Date is: DateTime::__set_state(array(
385+
Date is: \DateTime::__set_state(array(
386386
'date' => '2000-12-30 19:04:05.000000',
387387
'timezone_type' => 2,
388388
'timezone' => 'PDT',
389389
))
390390
------------
391391
Formatted DateTime is : 12/30/00, 5:04 PM
392392
------------
393-
Date is: DateTime::__set_state(array(
393+
Date is: \DateTime::__set_state(array(
394394
'date' => '2000-12-30 19:04:05.000000',
395395
'timezone_type' => 2,
396396
'timezone' => 'PDT',

ext/spl/tests/bug65967.phpt

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,5 +10,5 @@ gc_collect_cycles();
1010
var_export($objstore);
1111
?>
1212
--EXPECT--
13-
SplObjectStorage::__set_state(array(
13+
\SplObjectStorage::__set_state(array(
1414
))

ext/spl/tests/fixedarray_022.phpt

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ call_user_func(function () {
1111
?>
1212
--EXPECTF--
1313
Warning: var_export does not handle circular references in %s on line 5
14-
SplFixedArray::__set_state(array(
14+
\SplFixedArray::__set_state(array(
1515
0 => NULL,
1616
))
1717
object(SplFixedArray)#2 (1) refcount(4){

ext/spl/tests/fixedarray_023.phpt

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ call_user_func(function () {
1818
Warning: var_export does not handle circular references in %s on line 8
1919

2020
Warning: var_export does not handle circular references in %s on line 8
21-
SplFixedArray::__set_state(array(
21+
\SplFixedArray::__set_state(array(
2222
0 => NAN,
2323
1 => 0.0,
2424
2 => NULL,

0 commit comments

Comments
 (0)