Re: proposed access modifier "silent" ... was: Re: [PHP-DEV] Implicit isset/isempty check on short-ternary operator
| From: | Richard Quadling | Date: | Tue, 12 Apr 2011 11:33:17 +0000 |
| Subject: | Re: proposed access modifier "silent" ... was: Re: [PHP-DEV] Implicit isset/isempty check on short-ternary operator | ||
| References: | 1 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-51877@lists.php.net to get a copy of this message | ||
Considering that the main impetus for these threads is to write code
that does not generate the notice regarding missing variables or
indices, neither isset() or empty() will provide that completely.
If a variable is declared, but assigned null, it is not set and it is
empty. But so what. The variable exists and will not generate a notice
if access is attempted. No suppression of the non existent notice is
necessary.
The issue is one of undefined variables and indices. That's what the
E_NOTICE says ...
Notice: Undefined variable
Notice: Undefined index
To directly detect the presence of a key, then array_key_exists() is
the function that covers the requirement.
Global variables are easily detectable using array_key_exists($key, $GLOBALS);
Properties for an object ... property_exists().
For locally scoped variables, the function get_defined_vars() can be
combined with array_key_exists().
But the obvious overhead of having to extract all the variables into a
temp array is probably going to be a performance no-no.
The script below (and in [1] in case the formatting all goes wonky),
demonstrates this.
Ideally, a construct that specifically detects if a variable is
declared, irrespective of its value, would be the perfect solution as
this could be combined with isset() or empty() as the developer needs.
Richard.
[1] http://pastebin.com/qLNYtfAw
<?php
error_reporting(-1);
function report($desc, $isset, $empty, $defined) {
return
$desc .
' isset() = ' . ($isset ? 'true ' : 'false') .
' empty() = ' . ($empty ? 'true ' : 'false') .
' defined = ' . ($defined ? 'true ' : 'false') .
PHP_EOL;
}
function tester() {
// $undefined_variable = '';
$defined_variable_null_value = null;
$defined_variable_value = 'non null variable';
$array = array(
// 'undefined_key' => '',
'defined_key_null_value' => null,
'defined_key_value' => 'non null element',
);
$defined_vars = get_defined_vars();
echo
report('Undefined variable ',
isset($undefined_variable),
empty($undefined_variable),
array_key_exists('undefined_variable', $defined_vars)),
report('Defined variable null value ',
isset($defined_variable_null_value),
empty($defined_variable_null_value),
array_key_exists('defined_variable_null_value', $defined_vars)),
report('Defined variable non-null value ',
isset($defined_variable_value),
empty($defined_variable_value),
array_key_exists('defined_variable_value', $defined_vars)),
report('Undefined key ',
isset($array['undefined_key']),
empty($array['undefined_key']),
array_key_exists('undefined_key', $array)),
report('Undefined key null value ',
isset($array['defined_key_null_value']),
empty($array['defined_key_null_value']),
array_key_exists('defined_key_null_value', $array)),
report('Undefined key non-null value ',
isset($array['defined_key_value']),
empty($array['defined_key_value']),
array_key_exists('defined_key_value', $array));
}
tester();
?>
--
Richard Quadling
Twitter : EE : Zend
@RQuadling : e-e.com/M_248814.html : bit.ly/9O8vFY