Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何协调SplClassLoader的命名空间要求与自定义目录布局?_Php_Psr 0_Spl Autoloader - Fatal编程技术网

Php 如何协调SplClassLoader的命名空间要求与自定义目录布局?

Php 如何协调SplClassLoader的命名空间要求与自定义目录布局?,php,psr-0,spl-autoloader,Php,Psr 0,Spl Autoloader,我最近开始用PHP编写自定义MVC框架。这基本上是一个学习练习 我的类位于以下目录中: 系统/图书馆/ 系统/控制器/ 系统/模型 应用程序/库/ 应用程序/控制器/ 应用/模型 我没有使用名称空间,因为我不知道如何使用名称空间和Apache 2处理程序样式的URL controller/action/id实例化控制器。我创建了一个引导类来自动加载其他类: PSR-0的目标是尝试指定外部第三方库类的命名方式,以及包含这些类的文件在磁盘上的位置。这个目标已经实现了,从高水平来看,这不是一件坏事。互

我最近开始用PHP编写自定义MVC框架。这基本上是一个学习练习

我的类位于以下目录中:

系统/图书馆/ 系统/控制器/ 系统/模型 应用程序/库/ 应用程序/控制器/ 应用/模型 我没有使用名称空间,因为我不知道如何使用名称空间和Apache 2处理程序样式的URL controller/action/id实例化控制器。我创建了一个引导类来自动加载其他类:


PSR-0的目标是尝试指定外部第三方库类的命名方式,以及包含这些类的文件在磁盘上的位置。这个目标已经实现了,从高水平来看,这不是一件坏事。互操作性和不跨越其他库是一件好事

您的目录布局和类命名方案与PSR-0不匹配,这意味着SplClassLoader对您来说几乎毫无用处

您有两个选择:

重命名所有类,将它们重新排列到名称空间层次结构中,重构需要担心的其余代码,或者 不要使用SplClassLoader并编写自己的自动加载器。 如果您正在构建一个用于外部分发的库,那么最好使您自己符合PSR-0,因为它非常简单、逻辑性强且无痛


如果你正在构建自己的应用程序供自己使用,并且不打算将其作为一个库,那么你不需要做所有这些工作,你也不应该这样做,因为这样做很愚蠢。看起来是这样的,所以我可以以一个大胖子结束:不用麻烦了。

我让它起作用了。耶

下面是我的front controller index.php中的代码,我将对其进行重构,因为只需对某种类型的引导类进行一次调用就更为简洁:

<?php
use NeilMVC\system\libraries\Loader;
require_once('conf/conf.php');
require_once('SplClassLoader.php');

$loadSystemLibraries = new SplClassLoader('NeilMVC\system\libraries'); 
$loadSystemControllers = new SplClassLoader('NeilMVC\system\controllers');
$loadSystemModels = new SplClassLoader('NeilMVC\system\models');

$loadApplicationLibraries = new SplClassLoader('NeilMVC\application\libraries');
$loadApplicationControllers = new SplClassLoader('NeilMVC\application\controllers');
$loadApplicationModels = new SplClassLoader('NeilMVC\application\models');

$loadSystemLibraries->register();
$loadSystemControllers->register();
$loadSystemModels->register();

$loadApplicationLibraries->register();
$loadApplicationControllers->register();
$loadApplicationModels->register();

$loader = new Loader($_GET);
$controller = $loader->createController();
$controller->executeAction();
我必须重构一些类,以便将完全限定类解析为MVC样式URL中使用的非限定名称。这并不是很难做到,我只是需要修改一下才能理解。如果有人想知道更多,你可以通过我的网站给我发电子邮件


干杯,节日快乐

为什么要实现仅为Windows设计的自动加载器?这是唯一合乎逻辑的结论,因为另一种解释是PSR-0 autoloader不是为PHP设计的。无论您做什么,当您知道要查找什么时,不要迭代目录的内容。你不想白白统计那么多次。@tereško我不确定我是否理解你的问题。我在Ubuntu Linux上工作,不是windows。PSR-0与Windows无关,它是为PHP自动加载程序的互操作性而开发的标准。@NeilGirardi您知道吗,PHP中的类名、名称空间、类方法和特征不区分大小写,而PSR-0将它们视为区分大小写。它正常运行的唯一方法是使用不区分大小写的文件系统。也就是说-FAT32/NTFS。如果您不愿意以一致的方式将类资本化,那么您的问题比您的自动加载器严重得多。大约五年前,我们在办公室里打过这场仗。它以nerf枪和500线自动装弹机结束。谢天谢地,我拿到了分数,但我想学习PSR-0的方法。假设我将类目录移动到NeilsMVC目录中,并添加如下名称空间:\NeilsMVC\System\libraries。然后我会这样加载这些类吗$loadSystemLibs=new-SplCLassLoader'\NeilsMVC\system\libraries';名称空间和目录路径的使用似乎是多余的,因为名称空间无论如何都要转换为目录路径。另外,如果我正在使用$\u GET数组中的控制器来确定要初始化哪个控制器,那么如何重构代码以通过正确的命名空间调用它?
$libLoader = new SplClassLoader('', 'system/libraries');
<?php
use NeilMVC\system\libraries\Loader;
require_once('conf/conf.php');
require_once('SplClassLoader.php');

$loadSystemLibraries = new SplClassLoader('NeilMVC\system\libraries'); 
$loadSystemControllers = new SplClassLoader('NeilMVC\system\controllers');
$loadSystemModels = new SplClassLoader('NeilMVC\system\models');

$loadApplicationLibraries = new SplClassLoader('NeilMVC\application\libraries');
$loadApplicationControllers = new SplClassLoader('NeilMVC\application\controllers');
$loadApplicationModels = new SplClassLoader('NeilMVC\application\models');

$loadSystemLibraries->register();
$loadSystemControllers->register();
$loadSystemModels->register();

$loadApplicationLibraries->register();
$loadApplicationControllers->register();
$loadApplicationModels->register();

$loader = new Loader($_GET);
$controller = $loader->createController();
$controller->executeAction();