PHP传递变量以包括


81

我正在尝试将变量传递到包含文件中。我的主机更改了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

6
您不必传递变量以包含文件。当您将文件包含进来时,您的网络服务器将仅加载文件的代码,就像您已将包含文件中的代码写入其他文件一样。
莱昂·克雷默

您能否澄清“这些作品都没有”?错误消息也将有所帮助。而且,AFIAK,包含的代码在同一上下文中执行,因此global没有必要;您的第一个选择应该可以正常运行。
raina77ow 2012年

就像其他人所说的那样,include()就像将代码粘贴到那里一样,就像在同一文件中一样,它继续执行代码。您不必寻找将变量包含在包含文件中的方法,只需在include()之前将其编写(如果需要)。
adrianTNT 2012年

Answers:


48

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

这是带有$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' => &$title )$ title可以在包含文件中更改。
Mauro Mascia

我认为这不适用于更高版本的PHP,例如7.3
Robert Moskal

45

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

选项2没有多大意义-您将变量隐藏在函数中,并受PHP变量范围的约束。您还必须在$var = passvariable()某个地方将“内部”变量转换为“外部”,然后回到第一位。

选项1是最实用的。include()基本上会在指定的文件中进行提取并在此处执行,就好像文件中的代码实际上是父页面的一部分一样。它看起来确实像一个全局变量,大多数人对此并不满意,但是根据PHP的解析语义,这两个是相同的:

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

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

11

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

当包含文件时,该文件包含的代码将继承包含该行的行的可变范围。从那时起,调用文件中该行上可用的任何变量将在被调用文件中可用。

这些事情使我认为总有一个不同的问题。另外,选项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

?>

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


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

5

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

这将告诉您文件中包含哪些文件。将此放置在包含的文件中。

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

根据OP在他的问题中的评论,“该变量需要从调用的第一个文件中设置和评估(它实际上是'$ _SERVER ['PHP_SELF']'”,并且需要返回该文件的路径,而不是包含的第二个文件。 php)。” 他需要找出包含second.php的文件的路径。
Jeremy1026'8-10-10

注意。(您的答案尚不清楚,请澄清一下[[因为OP希望获得原始文件名等等等等)])。
马达拉的鬼魂

5

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

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

它也应该这样做:

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

....

echo $GLOBALS["myvar"];

祝你今天愉快。


4

选项1在PHP 7中对我有效,并且肯定在PHP 5中也适用。而且,对于包含文件的变量访问来说,全局作用域声明不是必需的,包含文件(或“必需”文件)是脚本的一部分,只需确保在变量声明之后设置“ include”即可。也许您在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。


3

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

代替:

include "myfile.php?var=apple";

这将是:

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

1

根据php docs(请参阅$ _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.

0

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

<div id="first"></div>

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

0

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

选项一,如果这样调整,它也应该起作用。

原本的

选项一

在第一个文件中:

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

在第二个文件中:

echo $variable;

调整

在第一个文件中:

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

在第二个文件中:

global $variable;
echo $variable;

-1

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


1
不,那是不正确的。相对路径在中可以正常使用include。您只需要确保以正确的“相对于”开始即可。
彼得·鲍尔斯

-2

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

firstFile.php

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

    echoFunction("message");

secondFile.php

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

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.