Issue
While reading through the Laravel Framework source code I stumbled upon this code
set_error_handler(function ($type, $msg) use (&$error) {
$error = $msg;
});
in the move() function of UploadedFile class of the symfony/http-foundation package that Laravel uses Here
Intelephense extension on VSCode raises a warning
Undefined variable '$error'
Deeply apologize for the screenshot of code (just in case this is a bug in the extension and you can't reproduce, please tell me) Sorry
While researching this, I found this answer that passes a closure use to set_error_handler
$that = $this;
set_error_handler( function() use ($that) { $that->customErrorHandler(); } );
My understanding is that customErrorHandler() is a function in the same class or context and it has to be defined outside the call
Searching for similar example on the official docs yield same results, see here
But the UploadedFile class of Symfony only define a private property $error global to the class so shouldn't it be like this?
$error = $this->error;
set_error_handler(function ($type, $msg) use (&$error) {
$error = $msg;
});
How does this code know to get the $error variable from the property without defining it?*
*that's if it's getting it from there, otherwise...
How is $error passed here? is the undefined warning legit? given the code does actually work (just curious)
Solution
The &$error is making the code work. Basically, it's assigning the $error variable to null when you pass the callable, and then inside, it's setting it to the error message, and used afterwards.
set_error_handler(function ($type, $msg) use (&$error) { $error = $msg; });
$moved = move_uploaded_file($this->getPathname(), $target);
restore_error_handler();
Then it is using the $error variable if it failed to move:
if (!$moved) {
throw new FileException(sprintf('Could not move the file "%s" to "%s" (%s)', $this->getPathname(), $target, strip_tags($error)));
}
It's the same as:
$error = null;
set_error_handler(function ($type, $msg) use (&$error) { $error = $msg; });
Without the &, it will throw an undefined variable notice.
And no the $error variable is not related to the error property.
You can take this code for example:
function executeCallback($callable) {
$callable();
}
executeCallback(function () use (&$error) {
$error = 'This is the error message.';
});
echo $error;
The $error variable is defined in the use (&$error) and used afterward. And the output of the echo would be:
This is the error message.
Answered By - Chin Leung Answer Checked By - Katrina (PHPFixing Volunteer)

0 Comments:
Post a Comment
Note: Only a member of this blog may post a comment.