<?php
class Foo
{
public $dummy1;
public $dummy2;
}
class ErrorHandler
{
private $private = 'THIS IS PRIVATE'."\n";
function __construct()
{
set_error_handler(
function ($errno, $errstr, $errfile, $errline) {
$this->handleError($errno, $errstr, $errfile, $errline);
}
);
}
private function handleError($errno, $errstr, $errfile, $errline, $errmodule = null)
{
echo __METHOD__. " dealing with error $errstr, $errfile:$errline\n";
// This attribute is no longer accessible in this object. Same for other
// objects and their private attributes once we reach in this state.
echo $this->private;
echo "Never executed in PHP7.2; there is a fatal error in the line above\n";
}
}
function reproduceBug(Foo $f)
{
unset($f->dummy2);
foreach ((new ReflectionObject($f))->getProperties() as $p)
echo $p->getName() .' = '. $p->getValue($f) ."\n";
echo "This line is not reached in PHP7.2; but it is reached in PHP 7.0\n";
}
$errorHandler = new ErrorHandler();
#echo $x; # uncommenting this fixes it
reproduceBug(new Foo);
dummy1 =
ErrorHandler::handleError dealing with error Undefined property: Foo::$dummy2, /in/9ScMs:39
THIS IS PRIVATE
Never executed in PHP7.2; there is a fatal error in the line above
dummy2 =
This line is not reached in PHP7.2; but it is reached in PHP 7.0
Output for 8.3.5
Warning: PHP Startup: Unable to load dynamic library 'sodium.so' (tried: /usr/lib/php/8.3.5/modules/sodium.so (libsodium.so.23: cannot open shared object file: No such file or directory), /usr/lib/php/8.3.5/modules/sodium.so.so (/usr/lib/php/8.3.5/modules/sodium.so.so: cannot open shared object file: No such file or directory)) in Unknown on line 0
dummy1 =
ErrorHandler::handleError dealing with error Undefined property: Foo::$dummy2, /in/9ScMs:39
THIS IS PRIVATE
Never executed in PHP7.2; there is a fatal error in the line above
dummy2 =
This line is not reached in PHP7.2; but it is reached in PHP 7.0
Output for 7.1.0 - 7.1.33, 7.2.0 - 7.2.11
dummy1 =
ErrorHandler::handleError dealing with error Undefined property: Foo::$dummy2, /in/9ScMs:39
Fatal error: Uncaught Error: Cannot access private property ErrorHandler::$private in /in/9ScMs:28
Stack trace:
#0 /in/9ScMs(17): ErrorHandler->handleError(8, 'Undefined prope...', '/in/9ScMs', 39)
#1 [internal function]: ErrorHandler->{closure}(8, 'Undefined prope...', '/in/9ScMs', 39, Array)
#2 /in/9ScMs(39): ReflectionProperty->getValue(Object(Foo))
#3 /in/9ScMs(48): reproduceBug(Object(Foo))
#4 {main}
thrown in /in/9ScMs on line 28
Process exited with code 255.
Output for 5.6.0 - 5.6.40, 7.0.0 - 7.0.6
dummy1 =
dummy2 =
This line is not reached in PHP7.2; but it is reached in PHP 7.0