帮助我理解一段PHP代码

时间:2011-09-19 16:20:15

标签: php

如果没有$ _GET,我试图给变量赋予默认值。有if(isset(...))的方法,但它为每个变量编写了一堆代码。在研究另一种解决方案的同时发现了这段代码。任何人都可以帮我理解第二行代码吗?

$defaults = array('page' => 'main', 'lang' => 'en');
foreach ($defaults as $k => $v) $$k = isset($_GET[$k])? $_GET[$k] : $v;

8 个答案:

答案 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]$vif $_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