PHP 8.5.0 Alpha 4 available for testing

Voting

: min(two, zero)?
(Example: nine)

The Note You're Voting On

Andrew Penry
20 years ago
The following is an example of how to test if a variable is set, whether or not it is NULL. It makes use of the fact that an unset variable will throw an E_NOTICE error, but one initialized as NULL will not.

<?php

function var_exists($var){
if (empty(
$GLOBALS['var_exists_err'])) {
return
true;
} else {
unset(
$GLOBALS['var_exists_err']);
return
false;
}
}

function
var_existsHandler($errno, $errstr, $errfile, $errline) {
$GLOBALS['var_exists_err'] = true;
}

$l = NULL;
set_error_handler("var_existsHandler", E_NOTICE);
echo (
var_exists($l)) ? "True " : "False ";
echo (
var_exists($k)) ? "True " : "False ";
restore_error_handler();

?>

Outputs:
True False

The problem is, the set_error_handler and restore_error_handler calls can not be inside the function, which means you need 2 extra lines of code every time you are testing. And if you have any E_NOTICE errors caused by other code between the set_error_handler and restore_error_handler they will not be dealt with properly. One solution:

<?php

function var_exists($var){
if (empty(
$GLOBALS['var_exists_err'])) {
return
true;
} else {
unset(
$GLOBALS['var_exists_err']);
return
false;
}
}

function
var_existsHandler($errno, $errstr, $errfile, $errline) {
$filearr = file($errfile);
if (
strpos($filearr[$errline-1], 'var_exists') !== false) {
$GLOBALS['var_exists_err'] = true;
return
true;
} else {
return
false;
}
}

$l = NULL;
set_error_handler("var_existsHandler", E_NOTICE);
echo (
var_exists($l)) ? "True " : "False ";
echo (
var_exists($k)) ? "True " : "False ";
is_null($j);
restore_error_handler();

?>

Outputs:
True False
Notice: Undefined variable: j in filename.php on line 26

This will make the handler only handle var_exists, but it adds a lot of overhead. Everytime an E_NOTICE error happens, the file it originated from will be loaded into an array.

<< Back to user notes page

To Top