试图了解命名空间和自动加载在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
答案 0 :(得分:2)
Autoload无法正常工作。 首先,我将解释自动加载器的工作原理。
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的param是我的函数的名字,这个函数注册了函数,所以当一个类被实例化时它会运行那个函数。
现在,使用自动加载器和命名空间的有效方法如下:
file - /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');
file - /index.php
include 'autoloader.php';
$tree = new Libs\Tree();
$apple_tree = new Libs\Tree\AppleTree();
file - /Libs/Tree.php
namespace Libs;
class Tree
{
public function __construct()
{
echo 'Builded '.__CLASS__;
}
}
file - /Libs/Tree/AppleTree.php
namespace Libs\Tree;
class AppleTree
{
public function __construct()
{
echo 'Builded '.__CLASS__;
}
}
我正在使用命名空间和自动加载以很好的方式加载我的函数,您可以使用命名空间来描述您的类所在的目录,并使用自动加载器魔术来加载它而没有任何问题。
注意:我使用常量'DS',因为在* nix中它使用'/'而在Windows中它使用'\',使用DIRECTORY_SEPARATOR我们不必担心代码将在哪里运行,因为它将是“路径兼容的”