PHP传递变量给include语句

102
我正试图将一个变量传递到一个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。

我错过了什么吗?

谢谢!


2
你尝试过定义一个常量吗? - Oussama Jilal
10
在包含文件时,您不必传递变量。当您包含文件时,您的Web服务器将加载文件的代码,就好像您已经将该代码从包含文件中编写到其他文件中一样。请注意,这并不会改变原本的含义。 - Leon Kramer
请问您能澄清一下“None of these works”的意思吗?错误信息也会有所帮助。据我所知,所包含的代码在同一上下文中执行,因此global不是必需的;您的第一个选项应该可以正常运行。 - raina77ow
正如其他人所说,include() 就像将代码粘贴在那里一样,它继续执行代码,就像在同一个文件中一样。您不必找到一种方法将变量包含在 include 文件中,如果需要,可以在 include() 之前简单地编写它。 - adrianTNT
16个回答

67

说到传递变量以进行包含,它不需要任何特殊操作:在调用include之前定义的任何php变量都已经在包含的文件中可用(假设它在调用include的范围内可用)。这正是include的工作原理。

为了将一组变量传递给调用内部的函数,您可以使用extract()
Drupal在其theme()函数中使用它。

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

function includeWithVariables($filePath, $variables = array(), $print = true)
{
    // 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) {
        return $output;
    }
    echo $output;
}

**./index.php:**
includeWithVariables('header.php', array('title' => 'Header Title'));

./header.php :

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

1
您还可以在提取函数中添加EXTR_REFS标志来使用此方法(请参见https://www.php.net/manual/en/function.extract.php),以便在传递带有引用的变量时:`array('title' => &$title)`,$title可以在包含的文件中更改。 - Mauro Mascia
我认为这在较新版本的PHP中不起作用,比如7.3。 - Robert Moskal
2
它适用于(PHP 4、PHP 5、PHP 7、PHP 8),感谢您的回答,应该标记为正确答案。 - smarteist

54

选择方案三是不可能的 - 你会得到渲染后的 .php 文件输出,就像在浏览器中访问该网址一样。如果你得到了原始的 PHP 代码(正如你所希望的),那么整个站点的源代码都将被公开,这通常是不好的。

方案二没有太多意义 - 你会将变量隐藏在一个函数中,并受制于 PHP 的变量作用域。你还必须在某个地方有 $var = passvariable() 才能获得"内部"变量到"外部"的变量,这样你回到了起点。

方案一是最实用的。include() 基本上会将指定的文件读入并在此处执行,就像文件中的代码实际上是父页面的一部分。它看起来像一个全局变量,大多数人都不喜欢这种方法,但根据 PHP 的解析语法,这两个选项是相同的:

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

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

“Slurp in”?很抱歉,我找不到一个好的定义! - Mattia Rasulo
2
“Slurp” 意味着读取文件的全部内容并将整个内容放在某个地方。基本上,include() 函数会复制所包含的文件并将其内容粘贴到 include() 函数的位置。 - Ullallulloo

14
考虑到在PHP中,包含语句基本上是将代码从文件中复制并粘贴到调用它的位置,并且手册上关于包含语句的说明如下:
当包含一个文件时,它所包含的代码会继承包含该语句的行的变量范围。 在调用文件中该行可用的任何变量都将从该点开始在被调用的文件中可用。
这些事情让我想到可能有一个完全不同的问题。此外,选项3永远不会起作用,因为您没有重定向到second.php,而只是包含它,选项2则是一种奇怪的解决方法。PHP中包含语句的最基本示例是:
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

?>

考虑到选项一是最接近这个例子的(尽管比它应该的更复杂),并且它不起作用,这让我认为您在包含语句中犯了一个错误(相对于根目录的错误路径或类似问题)。


也许我把事情的顺序搞混了?实际上结构是这样的:main.php $variable = $_SERVER['PHP_SELF']; include = 'http://side.com/footer.php;footer.php: echo $variable;所有被包含的文件都不包含变量,它只是对其进行某些操作。在我尝试的所有选项中,输出要么为空,要么包括footer.php的$_SERVER['PHP_SELF']而不是main.php的。这是不同的吗? - user1590646

7
我这里也有同样的问题,你可以使用 $GLOBALS 数组。
$GLOBALS["variable"] = "123";
include ("my.php");

它还应该以这种方式运行:
$myvar = "123";
include ("my.php");

....

echo $GLOBALS["myvar"];

祝您拥有愉快的一天。


这个答案自相矛盾。如果$myvar = "123",为什么要“使用$GLOBALS数组”,同时又“运行”? - Your Common Sense
你好,Common Sense。用户1590646描述了一个PHP配置,其中这是不可能的。 - Daniel

7

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

不要使用以下方式:

include "myfile.php?var=apple";

这将是:

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

6
选项 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即可。


4

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

这将告诉您哪个文件包含了该文件。将其放置在已包含的文件中。

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

根据OP在问题中的评论,“变量需要从调用第一个文件设置和评估(实际上是'$_SERVER['PHP_SELF']'),并且需要返回该文件的路径,而不是包含second.php的文件。”他需要找出包含second.php的文件的路径。 - WhoaItsAFactorial
明白了。(从你的回答中不太清楚,请澄清一下“因为 OP 想要获取原始文件名等等”) - Madara's Ghost

2

我知道这是一个老问题,但现在偶然看到它,并且没人提到过这一点,所以写下来。

如果将选项一进行类似于这样的调整,也应该可以工作。

原始内容:

Option One

In the first file:

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

In the second file:

echo $variable;

TWEAK

在第一个文件中:

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

在第二个文件中:
global $variable;
echo $variable;

0
根据php文档(请参见$_SERVER),$_SERVER ['PHP_SELF']是“当前执行脚本的文件名”。
INCLUDE语句“包含并评估指定的”文件,“它包含的代码继承了在include出现的行上的变量范围”(请参见INCLUDE)。
我相信,即使由'second.php'中的代码使用, $_SERVER['PHP_SELF']将返回第一个文件的文件名。
我使用以下代码进行测试,它按预期工作($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.

-1
通过设置 $_SESSION 变量将变量传递给 include 文件
例如: $_SESSION['status'] = 1; include 'includefile.php';
// 然后在 include 文件中读取 $_SESSION 变量 $status = $_SESSION['status'];

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接