代码之家  ›  专栏  ›  技术社区  ›  DCR

为什么在呈现一个新页面[duplicate]时无法访问php变量

  •  -1
  • DCR  · 技术社区  · 4 年前

    function render($template, $values = array()){
    
       // if template exists, render it
       if (file_exists("../views/$template")){
    
          // extract variables into local scope
          extract($values);
    
          // render header_form
          require("../views/header_form.php");
    
          // render template
          require("../views/$template");
    
          // render footer
          require("../views/footer_form.php");
    
       }else{
    
          // else err
          trigger_error("Invalid template: $template", E_USER_ERROR);
    
       }
    }
    

    假设我有一个脚本crew.php,如下所示:

    <?php
    
        require('../includes/config.php');
            $values=[];           
    
            $today = new DateTime();
    
            render('crew_form.php',$values);
    
    ?>
    

    <?php
    
        echo $today;
    ?>
    

    当您使用require时,这不只是将脚本添加到现有代码中吗?是因为函数render()的局部作用域吗?

    3 回复  |  直到 4 年前
        1
  •  1
  •   LSerni    4 年前

    你没有访问权限 $today 因为你是 . 变量是在函数外部定义的,在函数内部不可用——并且 render()

    你可以用计算机解决这个问题 use 关键字,或滥用 global 指令,但避免污染作用域的更好方法是显式传递变量并使用 extract()

    这正是您的代码试图做的,使用 $values . 但是你需要把 今天美元 在…内 并将其传递给 :

    $values['today'] = $today;
    

    现在,一个名为 将在crew-form.php中提供, 但情况将不一样 今天美元 即使它将以相同值的副本开始。你可以这样看得更清楚:

    $values['today2'] = $today;
    

    $today2 会存在,, 今天美元 不会,因为后者“超出范围”。

    退出时,对提取值的更改将丢失 render

        2
  •  0
  •   Evert    4 年前

    每件事 从头开始构建,请求完成后,所有内存都将释放。

    如果希望信息在请求之间传递,则需要一种存储机制,如数据库。这是经过设计的,PHP一直都是这样。

        3
  •  0
  •   DCR    4 年前

    看来我的直觉是正确的。如果$today是在render函数中创建的,那么我们确实可以在crew_form.php中打印出来。