如何在不包含文件的情况下使用类?

时间:2017-02-16 08:07:34

标签: php class

我在许多框架中都看到,您可以使用扩展类的方法而不包含该文件。 E.g。

Class MyController extends Controller {

当我在没有框架的情况下做同样的事情并尝试调用该方法时,我会得到:

  

致命错误:在......中找不到“助手”类

为什么我不能在没有包含文件的情况下使用该类?为什么这对框架起作用?

如果我使用名称空间,我可以摆脱包含部分吗?

2 个答案:

答案 0 :(得分:1)

大多数框架,库等使用autoloader来自动加载已请求但不在内存中的类。

目前的首选做法是拥有一个镜像命名空间的目录/文件结构,因此类\Foo\Bar\Baz将存储在一个目录中(相对于您的基本路径)/Foo/Bar/Baz.php。您可以实现一个非常简单的自动加载器来处理这个问题:

// Assume that BASE_DIR is a constant that is set somewhere

spl_autoload_register (function ($class) {
    $class = str_replace ("\\", DIRECTORY_SEPARATOR, $class);
    if (!is_file (BASE_DIR . $class)) {
        throw new \LogicException ("Class $class not found");
    }
    require (BASE_DIR . $class);
});

现在,当您尝试创建新的\ Foo \ Bar \ Baz而不自行明确要求时,将自动调用自动加载器并尝试为您提供。如果\ Foo \ Bar \ Baz也有明确要求的依赖项,那么自动加载器也会尝试加载它们。

上面的例子非常特别,更多的是用于演示目的而不是用于生产的东西,但希望它可以得到这个想法。现在很多应用程序都依赖Composer来处理它们的自动加载,因为它能够生成一个自动加载器文件来处理所有这些东西。您所要做的就是包含/要求Composer自动加载器,其他一切都将被处理。

答案 1 :(得分:-1)

因为Framework使用类似的代码实现类加载

$url = $_GET['url'];
$url = rtrim($url, '/');
$url = explode('/', $url);
require 'controllers/'.$url[0].'.php';
$controller = new $url[0];

因此,当您致电http://somesite.com/help/时,它将包含文件controller / help.php,其中包含类帮助

<?php
   class Help {
   public function __construct() {
   echo "You are in HELP";
   }
}
?>

注意:这只是新手的一个例子!!! ,实际上他们使用http://php.net/manual/ru/function.spl-autoload-register.php