我一直在尝试创建一个PHP加载器类来处理我所有的目录问题。我基本上让它工作,但是当包含全局函数时它会中断。
这是我正在使用的:
<?php
class Loader {
public function __construct() { ... }
private function check_if_file_exists($file) { ... }
public function load($file) {
$this->check_if_file_exists($file); //Throws fatal Exception if not a file
//The "important" stuff: works with global vars, not with global functions:
extract($GLOBALS, EXTR_REFS);
ob_start();
require_once "{$this->path}/$file";
return ob_get_clean();
}
}
这让我可以执行以下操作:
<?php
$loader = new Loader();
$loader->load('file.php'); //Class takes care of path stuff--don't worry about it
//This works:
print $variable_in_file_dot_php;
//This does NOT work:
function_in_file_dot_php();
我怎样才能使function_in_file_dot_php();
工作?
最好使用php中已经可用的AutoLoader类。请参阅此网址 http://php.net/manual/en/language.oop5.autoload.php
出于技术上的好奇,我将尝试回答您的问题,但我强烈建议您不要这样做。
参考包含/需要文档,我看到包含在文件中定义的变量将继承调用require的行的变量范围。 在您的情况下,这将是 Loader::load() 方法在 Loader 类的某个实例中的变量范围
因此,$variable_in_file 将在全球范围内不可用。 除非你
- 在调用 include 语句之前定义$var,从而为其提供全局范围。
- 在调用方法中声明它是全局的(Loader::load())
您将 #2 与 extract($GLOBALS...) 兼容,但是为了执行 #1,您必须先验地了解所包含的内容,然后再包含它......使使用 Loader 类进行泛化尝试无效。
但是function_in_file() 应该在全局范围内可用,我想查看您的文件.php和错误消息。 这是我的。
$cat福.php
public function load($file) {
extract($GLOBALS,EXTR_REFS);
require_once $file;
}
}
$variable = 1;
$loader = new Loader();
$loader->load('file.php');
echo "'n" . $variable;
echo "'n" . method();
$cat文件.php
<?php
function method() {
echo "hi i am a method";
}
输出
$php foo.php
hello i am a variablehi i am a method
但说真的,不要这样做。您似乎试图使用 include() 作为代码重用的向量,而它主要被设想为一种代码分离的方法。 您以一种难以调试和不可预测的方式弄乱了 phps 的自然范围。 这是一种反模式。