我有时会设置可能未设置的变量,而我想使用默认参数。像这里:
if ($p == "a") doSomething();
如果未定义$p
,则PHP抛出Notice: Undefined variable
。为了避免这种情况,我经常在这种情况下使用这个结构:
$p = (isset($p) ? $p : "");
但如果你不得不经常使用它,这很难看。所以我为它编写了一个函数:
function getIfSet(&$value, $default = '')
{
return isset($value) ? $value : $default;
}
// Example
if (getIfSet($p) == "a") doSomething();
我想知道是否有一个PHP函数或者你如何解决这个问题。
答案 0 :(得分:1)
稍微改进一下,更喜欢将null
值传递给$default
,传递空字符串可能会造成混乱,导致正确的值可以是空字符串。
function getIfSet(&$value, $default = null)
{
return isset($value) ? $value : $default;
}
$p = getIfSet($p);
答案 1 :(得分:0)
isset()和它一样干净。虽然我必须承认我不太喜欢默认为空字符串,只是因为变量可能是一个空字符串,但仍然“被设置”。我认为默认的bool false或null对于isset的行为更为真实:
function getIfSet(&$value, $default = false)
{
return isset($value) ? $value : $default;
}
$p = getIfSet($p);
if($p !== false){
//insert or whatever
}
else{
header('Location: error.php');
exit;
}
答案 2 :(得分:0)
根据您正在检查的值(可能是REQUEST数据?),请考虑使用类。它们很有趣,可以在任何地方使用。
假设您正在检查POST数据(如果不这样做,那么,请将此作为一个想法),创建一个检查此数组的类:
class Post
{
public function __get($index)
{
if (isset($_POST[$index]))
return $_POST[$index];
else
return null;
}
}
就这么简单。您知道当您尝试访问不存在的属性时会触发__get()。在这种情况下,如果属性(实际上,$ _POST数组中的索引)不存在,则返回null并且不会生成错误。
现在你可以做到:
$params = new Post();
$foo = $params->name ?: ''; // of course this doesn't make much sense.
if (!$params->password) ...
// instead of
if (isset($_POST['password'])) ...
// you'll still have to use isset for cases like:
if (isset($_POST['user']['password']) ...
if (isset($params->user['password'])) ...
// but still looks neater I'd say
你很快就会发现一个问题是$ params不是一个超级全局变量,而$ _POST是。怎么解决这个?在控制器类的构造函数中创建它,并对正在使用的所有其他对象使用Dependency Injection。
答案 3 :(得分:0)
当我想出这个解决方案时,我试图让renocor的答案更加干净和OOP:
class NiceArray implements ArrayAccess {
protected $array;
public function __construct(&$array) {
$this->array =& $array;
}
public function offsetExists($offset) {
return true;
}
public function offsetGet($offset) {
if (isset($this->array[$offset]))
{
return $this->array[$offset];
}
else
{
return null;
}
}
public function offsetSet($offset, $value) {
$this->array[$offset] = $value;
}
public function offsetUnset($offset) {
unset($this->array[$offset]);
}
}
用法:
$get = new NiceArray($_GET);
if ($get['p'] == "a") doSomething();
我知道这个类有点大,但是这样你仍然有一个数组,你可以轻松地将它用于你想要的每个数组。您无需更改之前可能拥有的任何代码。您仍然可以访问和更改数据。它甚至会改变原始阵列。