繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM