【问题标题】:PHP pass variable to include要包含的 PHP 传递变量
【发布时间】:2012-08-07 23:03:42
【问题描述】:

我正在尝试将变量传递到 include 文件中。我的主机更改了 PHP 版本,现在我尝试的任何解决方案都不起作用。

我想我已经尝试了所有能找到的选项。我敢肯定这是最简单的事情!

需要从调用的第一个文件中设置和评估变量(它实际上是$_SERVER['PHP_SELF'],并且需要返回该文件的路径,而不是包含的second.php)。

选项一

在第一个文件中:

global $variable;
$variable = "apple";
include('second.php');

在第二个文件中:

echo $variable;

选项二

在第一个文件中:

function passvariable(){
    $variable = "apple";
    return $variable;
}
passvariable();

选项三

$variable = "apple";
include "myfile.php?var=$variable"; // and I tried with http: and full site address too.


$variable = $_GET["var"]
echo $variable

这些都不适合我。 PHP版本是5.2.16。

我错过了什么?

谢谢!

【问题讨论】:

  • 您是否尝试定义一个常量?
  • 您不必传递变量来包含文件。当您包含文件时,您的网络服务器只会加载文件的代码,就像您将包含文件中的代码写入其他文件一样。
  • 您能澄清一下“这些都不是”吗?错误消息也会有帮助......而且,AFAIK,包含的代码是在相同的上下文中执行的,所以global 不是必需的;您的第一个选项应该运行良好。
  • 正如其他人所说,include() 就像将代码粘贴到那里一样,它会继续执行代码,就像在同一个文件中一样。您不必找到将变量包含在包含文件中的方法,您只需将其写在 include() 之前(如果需要)。

标签: php variables include global-variables global


【解决方案1】:

您可以使用extract() function
Drupal 在其 theme() 函数中使用它。

这里是一个带有 $variables 参数的渲染函数。

function includeWithVariables($filePath, $variables = array(), $print = true)
{
    $output = NULL;
    if(file_exists($filePath)){
        // Extract the variables to a local namespace
        extract($variables);

        // Start output buffering
        ob_start();

        // Include the template file
        include $filePath;

        // End buffering and return its contents
        $output = ob_get_clean();
    }
    if ($print) {
        print $output;
    }
    return $output;

}


./index.php :

includeWithVariables('header.php', array('title' => 'Header Title'));

./header.php :

<h1><?php echo $title; ?></h1>

【讨论】:

  • 您也可以使用此方法将 EXTR_REFS 标志添加到提取函数(请参阅php.net/manual/en/function.extract.php),这样当您通过引用传递变量时:array( 'title' =&gt; &amp;$title ) $标题可以在包含的文件中更改。
  • 我认为这不适用于更高版本的 PHP,比如 7.3
  • 它适用于(PHP 4、PHP 5、PHP 7、PHP 8),感谢您的回答,应标记为正确答案。
【解决方案2】:

选项 3 是不可能的 - 你会得到 .php 文件的渲染输出,就像你在浏览器中点击那个 url 一样。如果您获得原始 PHP 代码(如您所愿),那么您网站的所有源代码都将被公开,这通常不是一件好事。

选项 2 没有多大意义 - 您将变量隐藏在函数中,并受 PHP 变量范围的约束。您还必须在某处拥有$var = passvariable() 才能将“内部”变量传递到“外部”,然后您又回到了原点。

选项 1 是最实用的。 include() 基本上会在指定的文件中啜饮并在那里执行它,就好像文件中的代码实际上是父页面的一部分一样。它看起来确实像一个全局变量,这里的大多数人对此不以为然,但从 PHP 的解析语义来看,这两者是相同的:

$x = 'foo';
include('bar.php');

$x = 'foo';
// contents of bar.php pasted here

【讨论】:

  • “啜饮”?很抱歉,我找不到一个好的定义!
  • @MattiaRasulo "Slurp" 意味着读取文件的全部内容并将全部内容放在某处。基本上,include() 复制包含的文件并将其内容粘贴到 include() 函数的位置。
【解决方案3】:

考虑到最基本的 php 中的 include 语句从文件中获取代码并将其粘贴到您调用它的位置,并且 include 手册指出以下事实:

当一个文件被包含时,它包含的代码继承了包含发生的行的变量范围。从那时起,调用文件中该行的任何可用变量都将在被调用文件中可用。

这些事情让我觉得总有一个不同的问题。此外,选项 3 将永远不会起作用,因为您没有重定向到 second.php,您只是将其包括在内,而选项 2 只是一个奇怪的解决方法。 php中include语句最基本的例子是:

vars.php
<?php

$color = 'green';
$fruit = 'apple';

?>

test.php
<?php

echo "A $color $fruit"; // A

include 'vars.php';

echo "A $color $fruit"; // A green apple

?>

考虑到第一个选项最接近这个例子(即使它应该更复杂)并且它不起作用,它让我认为你在 include 语句中犯了一个错误(相对于根的错误路径或类似的问题)。

【讨论】:

  • 也许我混淆了事情的顺序?该结构实际​​上是: main.php $variable = $_SERVER['PHP_SELF'];包括='side.com/footer.php;页脚.php:回显$变量;所有包含的文件都不包含变量,它只是对它做一些事情。在我尝试的所有选项中,输出要么是空白的,要么包括 footer.php 的 $_SERVER['PHP_SELF'] 而不是 main.php。这有什么不同吗?
【解决方案4】:

我这里也有同样的问题,你可以使用 $GLOBALS 数组。

$GLOBALS["variable"] = "123";
include ("my.php");

它也应该这样做:

$myvar = "123";
include ("my.php");

....

echo $GLOBALS["myvar"];

祝你有美好的一天。

【讨论】:

    【解决方案5】:

    关于 OP 的问题,特别是“需要从调用的第一个文件中设置和评估变量(它实际上是 '$_SERVER['PHP_SELF']',并且需要返回该文件的路径,而不是包括第二个.php)。”

    这将告诉您哪个文件包含该文件。将其放入包含的文件中。

    $includer = debug_backtrace();
    echo $includer[0]['file'];
    

    【讨论】:

    • 基于他的问题“需要从调用的第一个文件中设置和评估变量(它实际上是'$_SERVER ['PHP_SELF']',并且需要返回的路径该文件,而不是包含的 second.php)。”他需要找出包含 second.php 的文件的路径。
    • 注明。 (从您的回答中不清楚,请澄清一下[“因为 OP 想要获取原始文件名等等等等”])。
    【解决方案6】:

    OPTION 1 在 PHP 7 中对我有用,而且在 PHP 5 中肯定也是如此。并且全局范围声明对于变量访问的包含文件不是必需的,包含 - 或“必需” - 文件是脚本的一部分,只需确保在变量声明之后进行“包含”。也许您的 PHP.ini 中的变量全局范围有一些错误配置?

    在第一个文件中尝试:

      <?php 
      $myvariable="from first file";
      include ("./mysecondfile.php"); // in same folder as first file LOLL
      ?>
    

    mysecondfile.php

      <?php 
      echo "this is my variable ". $myvariable;
      ?>
    

    它应该可以工作...如果它不只是尝试重新安装 PHP。

    【讨论】:

      【解决方案7】:

      我遇到了这个问题,我有一个基于 GET 参数设置变量的文件。并且该文件无法更新,因为它在大型内容管理系统的另一部分上正常工作。然而,我想通过包含文件运行该代码,而参数实际上不在 URL 字符串中。简单的解决方案是您可以像设置任何其他变量一样在第一个文件中设置 GET 变量。

      代替:

      include "myfile.php?var=apple";
      

      应该是:

      $_GET['var'] = 'apple';
      include "myfile.php";
      

      【讨论】:

        【解决方案8】:

        根据 php 文档(参见 $_SERVER)$_SERVER['PHP_SELF'] 是“当前执行脚本的文件名”。

        INCLUDE 语句“包含并评估指定的”文件和“它包含的代码继承了包含发生的行的变量范围”(请参阅​​INCLUDE)。

        我相信 $_SERVER['PHP_SELF'] 将返回第一个文件的文件名,即使在“second.php”中的代码使用时也是如此。

        我使用以下代码对此进行了测试,它按预期工作($phpSelf 是第一个文件的名称)。

        // In the first.php file
        // get the value of $_SERVER['PHP_SELF'] for the 1st file
        $phpSelf = $_SERVER['PHP_SELF'];
        
        // include the second file
        // This slurps in the contents of second.php
        include_once('second.php');
        
        // execute $phpSelf = $_SERVER['PHP_SELF']; in the secod.php file
        // echo the value of $_SERVER['PHP_SELF'] of fist file
        
        echo $phpSelf;  // This echos the name of the First.php file.
        

        【讨论】:

          【解决方案9】:

          我知道这是一个老问题,但现在偶然发现它,发现没有人提到这个。所以写吧。

          如果像这样调整选项一,它也应该可以工作。

          原版

          选项一

          在第一个文件中:

          global $variable; 
          $variable = "apple"; 
          include('second.php'); 
          

          在第二个文件中:

          echo $variable;

          调整

          在第一个文件中:

          $variable = "apple"; 
          include('second.php');
          

          在第二个文件中:

          global $variable;
          echo $variable;
          

          【讨论】:

            【解决方案10】:

            您可以在“second.php”中使用jQuery添加变量来执行所有操作

            <div id="first"></div>
            
            <script>
            $("#first").load("second.php?a=<?php echo $var?>")
            </scrpt>
            

            【讨论】:

              【解决方案11】:

              我发现 include 参数需要是整个文件路径,而不是相对路径或部分路径才能正常工作。

              【讨论】:

              • 不,这是不正确的。相对路径在include 中工作得很好。你只需要确保你假设一个正确的“相对于什么”开头。
              【解决方案12】:

              这对我有用:将第二个文件的内容包装到一个函数中,如下所示:

              firstFile.php

              <?php
                  include("secondFile.php");
              
                  echoFunction("message");
              

              secondFile.php

              <?php
                  function echoFunction($variable)
                  {
                      echo $variable;
                  }
              

              【讨论】:

                【解决方案13】:

                这样做:

                $checksum = "my value"; 
                header("Location: recordupdated.php?checksum=$checksum");
                

                【讨论】:

                • 虽然这可能会回答这个问题,但在您的答案中加入一些文字来解释您在做什么总是一个好主意。阅读how to write a good answer
                • 一些解释会很好。
                猜你喜欢
                • 2011-11-28
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2010-12-08
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多