如果没有$ _GET,我试图给变量赋予默认值。有if(isset(...))
的方法,但它为每个变量编写了一堆代码。在研究另一种解决方案的同时发现了这段代码。任何人都可以帮我理解第二行代码吗?
$defaults = array('page' => 'main', 'lang' => 'en');
foreach ($defaults as $k => $v) $$k = isset($_GET[$k])? $_GET[$k] : $v;
答案 0 :(得分:5)
<condition> ? <true> : <false>
是
的简短版本if (<condition>) {
<true>
} else {
<false>
}
您的代码更具可读性:
$defaults = array('page' => 'main', 'lang' => 'en');
foreach ($defaults as $key => $value) {
if (isset($_GET[$key])) {
// $$key expands to $page and $lang
$$key = $_GET[$key];
} else {
$$key = $value;
}
}
答案 1 :(得分:2)
从变量中分配变量是一种丑陋的方式。
在foreach的末尾,你会找到一个名为$page
的变量,其上有$_GET[$k]
或$v
(if $_GET[$k]
存在,这是一个三元运算符)
答案 2 :(得分:1)
使用变量来实现自己的“extract()”函数很难看,但至少不像使用extract()本身那样不安全。
基本上,它正在对数组进行循环。第一次迭代,$ k变为'page',$ v变为'main',代码归结为:
make_variable_with_name('page') = isset($_GET['page']) ? $_GET['page'] : 'main';
答案 3 :(得分:1)
$defaults
中有2个项目,对于第一个循环迭代,它意味着:
if(isset($_GET[$k]))
{
$page=$_GET[$k];
}
else
{
$page='main';
}
对于第二次循环迭代,它意味着:
if(isset($_GET[$k]))
{
$lang=$_GET[$k];
}
else
{
$lang='en';
}
答案 4 :(得分:1)
如果将其分解为多行,则更容易解释。
//This associative array defines your default values
$defaults = array('page' => 'main', 'lang' => 'en');
//This loops through that array, setting
// $k to each key, and
// $v to each value
foreach ($defaults as $k => $v)
{
//$$k references a variable called $k,
//For instance, on the first time through the loop,
// it references a variable called $page
//isset($_GET($k]) checks if the browser sent a value
// for the key $k.
//The ternary operate (?:) returns that value if the
// browser sent it, or returns the value from the $defaults
// array if the browser did not.
$$k = isset($_GET[$k])? $_GET[$k] : $v;
}
所以这里发生的最先进和不常见的事情是$$k
,它只允许你引用一个名为 $k
的变量。
答案 5 :(得分:0)
您的$ defaults变量的格式为:
$defaults = array('page' => 'main', 'lang' => 'en');
$$ k将自动创建一个名为$ k变量内容的变量
基本上结果就是那个
$page = isset($_GET['page'])? $_GET['page'] : 'main';
答案 6 :(得分:0)
第二行是说,对于默认数组中的每个项目,将索引放在$k
中,将值放在$v
中。接下来,取$k
的值并创建一个名为key的变量,例如$ page = ...接下来,检查密钥的GET
是否有值,如果有,请设置为$page
作为该值,否则,将其设置为数组中的值。
不确定是否有意义......
答案 7 :(得分:0)
这是循环通过$ defaults数组的每个循环。
循环中的语句(isset($_GET[$k])? $_GET[$k] : $v;
)是一个普通的if语句,带有替代的一行语法。它等于:
if(isset($_GET[$k]))
{
$$k = $_GET[$k];
}
else
{
$$k = $v;
}
您可以在此处阅读双美元符号:http://www.php.net/manual/en/language.variables.variable.php