【问题标题】:PHP namespace autoloadPHP 命名空间自动加载
【发布时间】:2014-04-13 20:24:38
【问题描述】:

试图了解命名空间和自动加载在 PHP 上的工作原理

Server.php 位于 core/server.php

namespace core\server

{
     class Main
     {
        public function getTopic()
        {
            $get_params = $_GET;    
            if (empty($get_params)) $get_params = ['subtopic' => 'test'];   
            return $get_params;
        }
     }
}

和Index.php

spl_autoload_register();

use core\server as subtopic;

$test = new subtopic\Main();

var_dump($test);

它无法加载类 core/server/Main

【问题讨论】:

  • 子主题!== 子主题
  • 改了,还是找不到
  • 好的,所以它无法加载类...自动加载器配置不正确。有什么问题?
  • spl_autoload_register();.... 你在传递什么参数?

标签: php namespaces autoload


【解决方案1】:

自动加载不是这样工作的。 首先我将解释自动加载器的工作原理。

spl_autoload_register() 是一个函数,用于将代码中的函数注册到服务器作为自动加载器,标准函数是:

define('APP_PATH','/path/to/your/dir');

function auto_load($class)
{
    if(file_exists(APP_PATH.$class.'.php'))
    {
        include_once APP_PATH.$class.'.php';
    }
}

spl_autoload_register('auto_load');

常量 APP_PATH 将是代码所在目录的路径。 正如您所注意到的,传递给 spl_autoload_register 的参数是我的函数的名称,它注册了函数,因此当一个类被实例化时,它会运行该函数。

现在使用自动加载器和命名空间的有效方法如下:

文件 - /autoloader.php

define('APP_PATH','/path/to/your/dir');
define('DS', DIRECTORY_SEPARATOR);

function auto_load($class)
{
    $class = str_replace('\\', DS, $class);
    if(file_exists(APP_PATH.$class.'.php'))
    {
        include_once APP_PATH.$class.'.php';
    }
}

spl_autoload_register('auto_load');

文件 - /index.php

include 'autoloader.php';

$tree = new Libs\Tree();

$apple_tree = new Libs\Tree\AppleTree();

文件 - /Libs/Tree.php

namespace Libs;
class Tree
{
   public function __construct()
   {
      echo 'Builded '.__CLASS__;
   } 
}

文件 - /Libs/Tree/AppleTree.php

namespace Libs\Tree;
class AppleTree
{
    public function __construct()
    {
       echo 'Builded '.__CLASS__;
    } 
 }

我正在使用命名空间和自动加载以一种很好的方式加载我的函数,您可以使用命名空间来描述您的类所在的目录,并使用自动加载魔法来加载它而不会出现任何问题。

注意:我使用了常量 'DS',因为在 *nix 中它使用 '/' 而在 Windows 中它使用 '\',使用 DIRECTORY_SEPARATOR 我们不必担心代码将在哪里运行,因为它将是“路径兼容的”

【讨论】:

    猜你喜欢
    • 2013-11-25
    • 2011-08-06
    • 2015-07-15
    • 2012-05-21
    • 2011-04-08
    • 2013-10-24
    • 2014-11-02
    相关资源
    最近更新 更多