![](/img/trans.png)
[英]How the Class file is including in another file php using the namesapce and Use?
[英]How to use a class without including its file?
我已经在许多框架中看到,您可以使用扩展类的方法而不包含文件。 例如
Class MyController extends Controller {
当我在没有框架的情况下执行相同操作并尝试调用该方法时,将得到:
致命错误:在...中找不到类'Helper'
为什么在不包含其文件的情况下不能使用该类? 为何对框架有效?
如果使用名称空间,是否可以摆脱包含部分?
大多数框架,库等都使用自动加载器来自动加载所请求但不在内存中的类。
这些天的首选做法是拥有一个反映您的名称空间的目录/文件结构,因此\\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自动装带器,其他所有内容都将得到处理。
因为Framework使用这样的代码实现Class加载
$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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.