2011-02-23 73 views

回答

7

PHP那种有此操作(因为5.3我认为)这将你的榜样压缩到:

$myFruit = $_REQUEST['myfruit'] ?: "apple"; 

然而 ,我说“有点”,因为它只测试第一个操作数是否为false,如果没有设置,它不会抑制通知。所以如果(如你的例子)那样可能没有设置,那么你的原始代码是最好的。

功能类似于dictionary.get很简单:

function dget($dict, $key, $default) { 
    return isset($dict[$key]) ? $dict[$key] : $default; 
} 

为清楚起见,我还是使用原来的代码。

编辑:在http://wiki.php.net/rfc/ifsetor ifsetor()的用户态执行#2比上述功能有点整洁,并与非阵列过工作,但具有相同的警告,默认的表情总是会即使评估,如果不是使用:

function ifsetor(&$variable, $default = null) { 
    if (isset($variable)) { 
     $tmp = $variable; 
    } else { 
     $tmp = $default; 
    } 
    return $tmp; 
} 
+0

我也做了同样的功能,只是好奇,如果有一些容易和内置我失踪。 – DhruvPathak 2011-02-23 11:12:10

1

据我所知,不存在任何像这样的PHP。

你可以自己实现这样类似

$myVar = "Using a variable as a default value!"; 

function myFunction($myArgument=null) { 
    if($myArgument===null) 
     $myArgument = $GLOBALS["myVar"]; 
    echo $myArgument; 
} 

// Outputs "Hello World!": 
myFunction("Hello World!"); 
// Outputs "Using a variable as a default value!": 
myFunction(); 
// Outputs the same again: 
myFunction(null); 
// Outputs "Changing the variable affects the function!": 
$myVar = "Changing the variable affects the function!"; 
myFunction(); 
+0

全局变量是代码异味。你应该避免它。无论如何,这似乎只适用于现有变量('myFunction($ x)'仍然会发出通知)或静态(硬编码)值。 – KingCrunch 2011-02-23 10:14:58

+0

是的,这是正确的 – Thariama 2011-02-23 11:02:29

-1

有一个在CakePHP的框架调用ife()功能,你可以在这里找到http://api13.cakephp.org/view_source/basics.php/,它是最后一个功能!

您可以使用它像这样:

echo ife($variable, $variable, 'default'); 
+0

使用'@'来抑制错误并不是一个好主意,只要你能避免它。然而:'isset($ variable)有什么区别? $变量:'默认'? – KingCrunch 2011-02-23 10:10:21

+1

这是比原来的代码更长,并使用错误抑制(不好!) – 2011-02-23 10:11:38

+0

@KingCrunch,我不认为有区别,在编码指南中不允许使用'?:''stlye“。但我更喜欢它,因为它更短,并且我的观点非常好读。 – powtac 2011-02-23 10:13:42

0

取而代之的测试,如果没有键存在,然后返回默认值,也可以填写您的阵列与此值,对其进行访问之前。

$expectedKeys = array('myfruit'); 
$requestData = array_merge (
    array_combine(
    $expectedKeys, 
    array_fill(0, count($expectedKeys), null)), 
    $_REQUEST); 

$postData现在是你所期望的所有密钥(由$expectedKeys指定)一个数组,但任何一项,即在$_REQUEST缺少的是null

$myFruit = $requestData['myfruit']; 
if (is_null($myFruit)) { 
    // Value not exists 
} 

但我也建议只留在三元运营商?:

1

您还可以创建一个实现ArrayAccess的类,该类在构造过程中传递2个数组($_REQUEST和带有默认值的数组),并使其透明地选择默认值。

顺便说一句,依靠$_REQUEST不是一个明智的想法。有关更多信息,请参阅$_REQUEST手册。

+0

我的问题一般是所有关联数组,例如使用$ _REQUEST。 – DhruvPathak 2011-02-23 10:23:32

+0

是的,只是想确保'$ _REQUEST'的诅咒被提及,因为它发生在问题中。 – tobyS 2011-02-23 11:11:56