使用 PHP 类中的 require 和 include 在类外部加载


Using require and include from PHP class to load outside the class

我一直在尝试创建一个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 将在全球范围内不可用。 除非你

  1. 在调用 include 语句之前定义$var,从而为其提供全局范围。
  2. 在调用方法中声明它是全局的(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 的自然范围。 这是一种反模式。