我目前正在进行一些使用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.php
和pageTpl.php
包含在Init.php
config.php
包含$page
数组,包含在pageTpl.php
index.php
包括Init.php
简而言之,只有id
数组的name
和$page
元素才能分配给我index.php
和var_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
)
答案 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', )