如何通过PHP的require()或include()函数传递变量?

52

当我使用以下代码时:

require("diggstyle_code.php?page=$page_no");

警告信息是:failed to open stream: No error,位于C:\xampp\htdocs\4ajax\gallery_core.php的第198行。

错误信息为:

Failed opening required 'diggstyle_code.php?page=1' (include_path='.;C:\xampp\php\PEAR') in C:\xampp\htdocs\4ajax\gallery_core.php on line 198

事先已经收集到变量$page_no的值。

但是,如果我从require函数的参数中省略'?page=$page_no'这一部分,那么不会显示任何错误或警告。

在使用require()函数时,我需要传递这个变量。


@Tomalak Geret'kal,我是新手,请您澄清一下您的话。 - sof_user
请阅读 FAQ(http://stackoverflow.com/faq),特别是标题为“我如何在这里提问?”的章节。 - Lightness Races in Orbit
9个回答

82

require()include()会打开与它们接收到的路径/名称对应的文件。

这意味着,根据你的代码,你必须在你的磁盘上有一个名为diggstyle_code.php?page=1的文件。显然不是这样的,所以它失败了。

引用PHP手册的变量作用域页面:

变量的作用域是它被定义的上下文。在大多数情况下,所有PHP变量只有一个作用域。这个单一作用域也包括被包含和被引用的文件。

在你的情况下,你不需要传递变量。如果你在当前脚本中有一个变量,它也会存在于你包含的脚本中,除了函数,它们有自己的作用域

在你的主脚本中,你应该有:

$page_no = 10;
require 'diggstyle_code.php';

diggstyle_code.php 文件中:
echo $page_no;
// Or work with $page_no the way you have to

记住,包含/需要一个文件与将其内容复制粘贴到所需的行上完全相同。

2
这仅适用于启用了auto_globals的代码。通过查询字符串传递的变量位于超全局变量$_GET数组中(或者也可以是$_REQUEST)。 - knittl
@knitti,你能给个例子吗?谢谢! - ryanjdillon
感谢@PascalMARTIN。这不是解决内部文件没有URL变量的方法,这是正确的做法。它可以在关闭$globals的情况下工作。我不知道为什么knittl会这样说,因为它使用标准的变量作用域。@knittl - 你能详细说明一下吗? - James

8

这应该可以工作,但这是一种非常不规范的hack方法:

$_GET['page'] = $page_no;
require('diggstyle_code.php');

您可能希望重构您的代码,使用函数和/或对象,并从您的文件中调用它们,而不是包含它们(警惕代码纷乱)。


  1. "重构你的代码" - 是什么意思?
  2. "从你的文件中调用它们" - 你是什么意思?
  3. "意大利面条式代码警告" - 代码变得笨拙了吗?
- sof_user
1
@sof_user:1)重构您的代码,使其更易于使用和维护,而不改变行为。2)创建函数,将它们包含在其他文件中,然后在需要时从这些文件中调用它们。3)代码变得难以维护且混乱不堪(就像意大利面条一样)。 - knittl

4
虽然这个问题比较古老,但是我使用的另一种选项在此线程中并未提及。你可以从所需文件返回一个函数,该函数接受要传递的参数。
return function(array $something) {
    print_r($something);
}

当你需要时,使用参数调用它:require

require('file.php')(['some', 'data']);

// or:

$context = require('file.php');
$context(['some', 'data']);

3

require 不会从 Web 服务器上拉取文件,它应该引用文件系统中的文件。

调用 includerequire 只是告诉 PHP 在此处将给定文件的内容粘贴到您的代码中,仅此而已。


2
如果我理解正确,您需要调用文件diggstyle_code.php并传递一个参数,这样就没有人可以调用该文件并使其工作,而不是调用您的主要文件。我理解正确吗?
因此,假设您的“main.php”有以下行:
require("diggstyle_code.php?page=$page_no");

这意味着: 如果有人调用“main.php”,则会运行diggstyle_code.php。 但是,如果任何人以任何方式直接调用diggstyle_code.php,他/她将得到空白页面。
如果我的理解正确,实现此目的的一种方法是,在主文件中包含一个变量或常量,该变量或常量将由diggstyle_code.php范围限定。
例如:'main.php'
<?php
define("_VERIFICATION_", "y");
require("diggstyle_code.php");
?>

现在是 diggstyle_code.php
<?php
if ( _VERIFICATION_ == "y" ) {
//Here the code should be executed
} else {
// Something else
}
?>

1

require() 不会发起 HTTP 请求,它只是从磁盘打开文件,并将代码包含在调用的位置。因此,简单的本地变量就足够了。


1
如果您的变量是全局的,就不需要“传递”它,它已经存在了:PHP 变量作用域
因此,答案是什么都不用做,如果 $page_no 存在于您调用 require() 的文件中,则它将在被包含的文件中可用。

-1

require、require_once、include 和 include_once 尝试在当前文件中从文件系统中包含文件。

由于没有名为 diggstyle_code.php?page=1 的文件,因此 PHP 无法找到它是完全合理的。

你不能通过这种方式传递值,但是在当前文件中声明的任何变量都可以在被包含的文件中访问。


-4

我遇到了这个问题,我注意到如果你在URL中使用http://,它就无法工作。


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