具有代码

时间:2016-03-12 10:10:15

标签: php function variables scope

我想理解为什么这段代码会给我:

function query_select_array($col1, $col2, $col3, $table, $code) {
    $query = "SELECT * FROM $table";
    if ($result = $this->myconn->query($query)) {
        while ($obj = mysqli_fetch_object($result)) {
            $a = $obj->$col1;
            $b = $obj->$col2;
            $c = $obj->$col3;
    $code = '$a - $b - $c <br>'; //I want pass this code with function, this is for test..
    eval("\$code = \"$code\";");
            echo $code;
        }
  mysqli_free_result($result);
    }
}

这:

  

1996 - La fondazione - Lorem ipsum dolor坐下来,念念   adipisicing elit。 sunt ut voluptatum eius sapiente,totam reiciendis   temporibus qui quibusdam,recusandae sit vero unde,sed,incidunt et   ea quo dolore laudantium consectetur!

     

Marzo 1999 - Ufficio laboratorio a Lavagna - Lorem ipsum dolor坐   amet,consectetur adipisicing elit。 sunt ut voluptatum eius sapiente,   totam reiciendis temporibus qui quibusdam,recusandae sit vero unde,   sed,incidunt et ea quo dolore laudantium consectetur!

     

2012年Dicembre - Spostri Levante Spostamento - Lorem ipsum dolor坐   amet,consectetur adipisicing elit。 sunt ut voluptatum eius sapiente,   totam reiciendis temporibus qui quibusdam,recusandae sit vero unde,   sed,incidunt et ea quo dolore laudantium consectetur!

     

Febbraio 2016 - Nuovo Sito - Lorem ipsum dolor sit amet,consectetur   adipisicing elit。 sunt ut voluptatum eius sapiente,totam reiciendis   temporibus qui quibusdam,recusandae sit vero unde,sed,incidunt et   ea quo dolore laudantium consectetur!

但是这个:

function query_select_array($col1, $col2, $col3, $table, $code) {
    $query = "SELECT * FROM $table";
    $code = '$a - $b - $c <br>'; //If I pass $code with the function i get the same effect...
    if ($result = $this->myconn->query($query)) {
        while ($obj = mysqli_fetch_object($result)) {
            $a = $obj->$col1;
            $b = $obj->$col2;
            $c = $obj->$col3;
            eval("\$code = \"$code\";");
            echo $code;
        }
  mysqli_free_result($result);
    }
}

生成不需要的内容:

  

1996 - La fondazione - Lorem ipsum dolor坐下来,念念   adipisicing elit。 sunt ut voluptatum eius sapiente,totam reiciendis   temporibus qui quibusdam,recusandae sit vero unde,sed,incidunt et   ea quo dolore laudantium consectetur!

     

1996 - La fondazione - Lorem ipsum dolor坐下来,念念   adipisicing elit。 sunt ut voluptatum eius sapiente,totam reiciendis   temporibus qui quibusdam,recusandae sit vero unde,sed,incidunt et   ea quo dolore laudantium consectetur!

     

1996 - La fondazione - Lorem ipsum dolor坐下来,念念   adipisicing elit。 sunt ut voluptatum eius sapiente,totam reiciendis   temporibus qui quibusdam,recusandae sit vero unde,sed,incidunt et   ea quo dolore laudantium consectetur!

     

1996 - La fondazione - Lorem ipsum dolor坐下来,念念   adipisicing elit。 sunt ut voluptatum eius sapiente,totam reiciendis   temporibus qui quibusdam,recusandae sit vero unde,sed,incidunt et   ea quo dolore laudantium consectetur!

任何人都可以帮助我吗?

2 个答案:

答案 0 :(得分:0)

在你的第二个例子中,你已将$code = '$a - $b - $c <br>';放在循环之外,因此循环遍历每一行时,该值不会改变。

在第一个示例中,它放在循环中,因此$a$b$b的值将在每次迭代时重新分配。

答案 1 :(得分:0)

这是因为你在循环中改变了$ code。

在第一次迭代中它等于“$ a - $ b - $ c
”但在第二次迭代中它已被替换。

尝试改变:

$code = '$a - $b - $c <br>';

要:

$codeTemplate = '$a - $b - $c <br>';

然后在循环内部将其写为:

eval("\$code = \"$codeTemplate\";");

编辑:

但是,如果你想让代码生成外部代码,可能代替eval(),你可以使用回调函数吗?

例如:

function query_select_array($table, $funcMakeCode) {
    $query = "SELECT * FROM $table";
    if ($result = $this->myconn->query($query)) {
        while ($obj = mysqli_fetch_object($result)) {
            $code = $funcMakeCode($obj);
            echo $code;
        }
        mysqli_free_result($result);
    }
}

...

query_select_array("tbl", function($obj) {
    $a = $obj->col1;
    $b = $obj->col2;
    $c = $obj->col3;
    return "{$a} - {$b} - {$c} <br>";
});