只是一个简单的问题,但我一直在研究一个小型的MVC框架并发现了一些东西。
例如:
- PHP文件 -
class loadFiles{
function __construct($file = NULL){
include $file . '.php';
}
}
$loadfiles = new $loadFiles('crucialsettings');
echo $randomstring; //Throws an error
- crucialsettings.php -
<?php
$randomstring = 'hello';
?>
我只是意识到对象范围内包含的文件无法从全局范围中访问。将文件包含在对象中以便可以全局访问的最佳方法是什么?
我希望能够:
$loadfiles->settings();
$loadfiles->classes();
$loadfiles->passwords();
我想构建一个处理全局文件包含的类。
答案 0 :(得分:2)
在PHP中包含或要求代码的位置无关紧要。解释器在它的第一个定义传递中是非常线性的,也就是说它基本上将所有包含/所需文件按照读取方式的确切顺序压缩到一个大文件中。
有一点需要注意的是,范围确实会发生变化。但一切都适用于“全球”范围。您始终可以使用“global”关键字将全局范围内的内容导入当前范围,以在使用变量之前声明变量。因此,当您想要使用其他脚本中的“全局”变量时,只需要它。
一个小例子......
<强> a.php只会强>
include('b.php');
global $myVar;
echo $myVar;
<强> b.php 强>
include('c.php');
<强> c.php 强>
$myVar = 'Hello World';
解释器在第一次通过后看到的代码是什么
// In global scope
$myVar = 'Hello World'
// In a.php scope
global $myVar;
echo $myVar;
简而言之,只需添加行
即可从php文件中删除global $randomstring;
包含criticalsettings.php文件后,您的回声将起作用。
答案 1 :(得分:1)
看来你的框架在内部过于依赖非OOP。不是一种优选的构建方式,但是可以通过遍历变量列表并使它们成为类/实例范围的一部分来执行您想要的操作。这里一个非常有用的功能是get_defined_vars();
假设你有文件a.php,b.php和c.php。每个看起来像这样:
a.php :<?php $a = "AAAAAA";
b.php :<?php $b = "BBBBBBBBBB";
c.php :<?php $c = "CCCCCCCCCCCCCCCCCCCCCCCCCCC";
class mystuff {
function include_with_vars( $____file ) {
// grab snapshot of variables, exclude knowns
$____before = get_defined_vars();
unset( $____before['____file'] );
// include file which presumably will add vars
include( $____file );
// grab snapshot of variables, exclude knowns again
$____after = get_defined_vars();
unset( $____after['____file'] );
unset( $____after['____before'] );
// generate a list of variables that appear to be new
$____diff = array_diff( $____after, $____before );
// put all local vars in instance scope
foreach( $____diff as $variable_name => $variable_value ) {
$this->$variable_name = $variable_value;
}
}
function __construct($file = NULL){
$this->include_with_vars( "a.php" );
$this->include_with_vars( "b.php" );
$this->include_with_vars( "c.php" );
}
}
$t = new mystuff();
echo "<PRE>";
print_r( $t );
此程序现在将从include()指令中获取局部变量,并将它们放在类范围中:
mystuff Object
(
[a] => AAAAAA
[b] => BBBBBBBBBB
[c] => CCCCCCCCCCCCCCCCCCCCCCCCCCC
)
换句话说,文件a.php($a
)中的局部变量现在为$t->a
。