将变量从一个PHP包含文件传递到另一个:全局与非


76

我正在尝试将变量从一个包含文件传递到另一个。除非我在第二个包含文件中将变量声明为全局变量,否则此方法不起作用。但是,我不需要在调用第一个include的文件中将其声明为全局文件。例如:


front.inc:

$name = 'james';

index.php:

include('front.inc');
echo $name;
include('end.inc');

输出:詹姆斯


end.inc:

echo $name;

输出:无


如果我在end.inc中回显$ name之前声明了全局$ name,那么它将正常工作。该帖子的可接受答案说明这取决于您的服务器配置:将PHP中的变量从一个文件传递到另一个文件

我正在使用Apache服务器。我将如何配置它,以便不必声明$ name为全局名称?一个相对于另一个有优点/缺点吗?


2
包括不喜欢的功能。包括不破坏变量范围。就像您将粘贴的包含文件内容直接复制到调用脚本中一样。
dqhendricks 2011年

2
函数中end.inc中的回显是什么?
dqhendricks 2011年

2
那会破坏变量范围。在这种情况下,您可能应该在参数中将$ name传递给函数。
dqhendricks 2011年

应该按书面规定!
deceze

end.inc中的回显不在函数内。假设我上面描述的三个文件包含的内容不超过我写的内容。
maxedison 2011年

Answers:


62

当在PHP中包含文件时,它的行为就像代码包含在文件中。想象一下,将代码从每个包含的文件中直接复制并粘贴到index.php。这就是PHP与include一起工作的方式。

所以,在你的榜样,因为你已经设置了一个名为变量$name在你的front.inc文件,然后既包括front.incend.inc你的index.php,你就可以echo$name后的任何地方includefront.inc你内index.php。同样,PHP会处理您index.php,就好像您所包含的两个文件中的代码是文件的一部分一样

当您将一个echo放在包含文件中的变量中,而不是在其内部未定义的变量中时,您将不会得到结果,因为它将与任何其他包含文件分开对待。

换句话说,要执行您期望的行为,您需要将其定义为全局行为。


51
您的回答似乎自相矛盾。您说过几次,包括一个文件就好像所有代码只是一个文件的一部分一样。因此,我在帖子中描述的内容等同于:$ name ='james'; echo $ name; echo $ name; -应该会产生果酱。但是您的倒数第二段与我刚才描述的相矛盾。也许您的意思是,只有进行include调用的文件才能访问包含文件的变量,因此其他包含文件没有访问这些变量的权限。那是对的吗?
maxedison 2011年

24
是的,听起来很正确。对不起,如果我说的话令人困惑。我编辑了大约5次,因为我很难描述这个过程而又不会迷失方向。因此,父文件可以访问两个包含文件中的变量,但包含文件不能访问另一个包含文件。如果那有意义的话。
Michael Irigoyen

除了已接受的答案外,其更正也是错误的(或过时的)。在PHP7中(至少),我可以在中定义一个变量,included1.php然后在included2.php不引用in的情况下引用它parent.php,并获取在中定义的值included1.php。我遵循与代码都在单个页面上相同的作用域规则。而已。
biscuitstack

3
之所以投票,是因为前两段与下面的句子明显矛盾。
约书亚洪水

简而言之:将您包含的文件放入函数中,并将所需的变量作为参数传递。这很令人讨厌,但是可以。😒︀–
约翰·

32

这是要避免的陷阱。如果您需要在函数中访问变量$ name,则需要说“ global $ name;”。在该功能的开始。您需要对同一文件中的每个功能重复此操作。

include('front.inc');
global $name;

function foo() {
  echo $name;
}

function bar() {
  echo $name;
}

foo();
bar();

只会显示错误。正确的方法是:

include('front.inc');

function foo() {
  global $name;
  echo $name;
}

function bar() {
  global $name;
  echo $name;
}

foo();
bar();

换句话说:global $var在将其用于其他功能之前,请先编写。
克里斯·Happy

2

这就是您要做的一切:

在前台

global $name;
$name = 'james';

2
与答案添加一些解释如何回答帮助OP在固定电流问题
ρяσѕρєяķ

1
我遇到了像maxedison所述的相同问题。我也对许多答案感到困惑:“ php过程包括您所复制和粘贴的内容...”,这是不正确的,并且由于迈克尔在他的回答下的解释,我理解包含文件中的代码无法识别先前包含文件中定义的全局变量。在我的实验中,我还遇到了一个问题,如果我在第一个iclude中使用“ global”关键字可以纠正这一问题-就像回答Paul。但是在哪里可以找到PHP文档中描述的两种情况?第二个问题是,仅从某些PHP版本来看,两者都不都是正确的吗?
StackPeter '17
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.