如何获取文件的变量' Index.php'包括' Init.php',而没有重新包含' Init.php'?

时间:2015-06-01 17:38:28

标签: php variables include

我目前正在进行一些使用MVC的小型个人框架的升级。

它目前的工作方式是,当Init.php包含在某个文件中时,它不是查找变量,而是获取文件的文本内容(实际的源代码),只是"切断& #34;变量。我相信它非常不正统,老实说,只是糟糕。

一位开发人员也开发了一个框架,该框架也使用了MVC,并且能够做我想做的正确方法。

<?php

require 'Init.php';

$page['id'] = 'index';
$page['name'] = 'Home';

这是我们的两个文件的样子,但是,如果我要说,请在$ page上使用变量而不是字符串[&#39; name&#39;]元素,页面的标题实际上是变量名称(想象&#34; Sitename - $ variable&#34;)

我已经花了大约2天的时间寻找答案,我找到了一个基本上使用require_once和ob_get_contents的有前途的,但是,我不想使用require_once。

我怎么能做我的开发人员所做的事情?

修改
这是我目前尝试获取数组的方法,它只适用于使用require_once。

/************* CONTENT PARSING **************/

global $page;

$buffer = explode('/', $_SERVER['PHP_SELF']);
$filename = $buffer[count($buffer) - 1]; // index.php in our case

var_dump($page); // Dumps NULL

ob_start();

include($filename);

echo $page['id']; // Echoes nothing

echo ob_get_contents(); // Echoes nothing

echo $page['id']; // Dumps nothing

ob_flush(); // Returns nothing

var_dump($page); // Dumps nothing

编辑2
这是包含文件和声明变量的方式

config.phppageTpl.php包含在Init.php

config.php包含$page数组,包含在pageTpl.php

之前

index.php包括Init.php

简而言之,只有id数组的name$page元素才能分配给我index.phpvar_extract($page)元素的值。{{ 1}},我希望开发人员能够全局访问变量。 (包括Init.php的地方)

我尝试在每个文件上运行$page,结果如下:

config.php(声明array ( 'id' => '', 'name' => '', ),数组的位置):
config.php

Init.php(包含array ( 'id' => '', 'name' => '', ),的地方):
array ( 'id' => 'index', 'name' => 'Test', )

index.php(值改变的地方):
Init.php

pageTpl.php($page中包含的文件,尝试访问NULL数组):
output=$( bash <<EOF #multiline/multiple command/s EOF )

2 个答案:

答案 0 :(得分:0)

好的,所以在对文档进行了几次阅读并阅读了几个框架的代码后,我注意到获取所有这些变量的最终值的唯一方法是使用PHP register_shutdown_function,即在脚本执行完成后调用的函数,这意味着所有变量都被处理,计算,因此只要它们是全局的,就可以从该函数访问所有变量。

示例:

<强>的index.php

<?

require 'Init.php';

$page['id'] = 'index';
$page['name'] = 'Home';

然后,在Init.php上我们做了所有复杂的框架内容,但是我们还包含了内核,它将包含关闭函数

<强>的init.php

<?

require 'inc/kernel.php';

new Kernel;

现在,内核,当然

<强> kernel.php

<?

class Kernel
{
    public function __construct()
    {
        register_shutdown_function('Kernel::Shutdown'); // Registers shutdown callback
        spl_autoload_register('Kernel::LoadMod'); // Not exactly sure why is this function necessary, but it is. All I know is that it tries to files of called classes that weren't included
    }

    static function Shutdown()
    {
        global $page;

        var_dump($page); // Will print what we defined in the $page array

        Module::LoadTpl($page); // We pass the $page array to the tpl module that will do the rest
    }
}

<强> module.php

类模块 {     静态函数LoadTpl($ page)     {         后续代码var_dump($页); //也会打印$ page,但现在我们不限于kernel.php     } }

然后,您可以从Module类将$page数组传递给其他类/文件。

答案 1 :(得分:-1)

使用索引定义数组时,需要以特定方式执行此操作。

的config.php:

<?php 
$page = array('id' => "", 'name' => "");
var_export($page);
?>

这将创建一个名为$page的数组,其索引为id&amp; name,其值为零。

现在在index.php中,您可以指定值:

<html>
<body>
<pre>
<?php

include 'Init.php';

$page['id'] = basename($_SERVER['PHP_SELF']);
$page['name'] = 'Home';

var_export($page);
?>
</pre>
</body>
</html>

这会导致页面显示:

array ( 'id' => '', 'name' => '', )
array ( 'id' => 'index.php', 'name' => 'Home', )