我在许多框架中都看到,您可以使用扩展类的方法而不包含该文件。 E.g。
Class MyController extends Controller {
当我在没有框架的情况下做同样的事情并尝试调用该方法时,我会得到:
致命错误:在......中找不到“助手”类
为什么我不能在没有包含文件的情况下使用该类?为什么这对框架起作用?
如果我使用名称空间,我可以摆脱包含部分吗?
答案 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