使用下划线(PEAR样式)标记从子文件夹自动加载php类


Autoload php classes from subfolders using underscore (PEAR style) notation

我对面向对象的PHP和MVC有点陌生,所以我真的需要一些帮助。

我有一个MVC风格的文件夹结构与子文件夹在文件系统
-例如:view/classes/subfolder/classname.php

我使用mod_rewrite人类友好的URL,如/classname/foldername/calssname,然后传递给页面加载器作为下划线分隔值。
-例如:foldername_classname

<>之前//页面加载器文件require_once ($ _SERVER DOCUMENT_ROOT"。"/地方/classLoader.php");session_start ();$page = new $_REQUEST['page'];之前

我以前一直使用[if/else if/else]块在每个可能的文件夹中进行测试,但这似乎效率低下,所以我正在寻找一种更好的方法来让自动加载器在许多不同的位置查看。

这是我最近的失败,它没有设法找到所请求的任何类,只是为每个类输出一个异常,并以致命错误结束!:

<>之前函数类路径($class) {$path = str_replace('_', '/', $class)。"。php";返回路径美元;}autoloadController($class) {回声"LoadController"。"
";$root = '/controller/classes/';$pathtoclass = $root.classToPath($class);尝试{If (file_exists($pathtoclass)) require_once($pathtoclass);否则抛出新的异常('Cannot load controller '.$class);} catch(异常$e) {echo 'Controller exception: '。$ e -> getMessage()。"
";}}autoloadModel($class) {回声"LoadModel"。"
";$root = '/model/classes/';$pathtoclass = $root.classToPath($class);尝试{If (file_exists($pathtoclass)) require_once($pathtoclass);否则抛出新的异常('Cannot load model '.$class);} catch(异常$e) {echo 'Model exception: '。$ e -> getMessage()。"
";}}自动加载视图($class) {回声"未经"。"
";$root = '/view/classes/';$pathtoclass = $root.classToPath($class);尝试{If (file_exists($pathtoclass)) require_once($pathtoclass);否则抛出新的异常('Cannot load view '.$class);} catch(异常$e) {echo '查看异常:'。$ e -> getMessage()。"
";}}spl_autoload_register("autoloadController");spl_autoload_register("autoloadModel");spl_autoload_register("autoloadView");之前



我也想知道URL到文件夹/类映射应该如何工作:
-即URL: /foldername/classname mod_重写为foldername_classname;
foldername文件夹下的类文件名为classname.php;
和一个php类定义class foldername_classname extends another_class { etc.

这个方法正确吗?

纯属偶然,在另一件事上,我找到了解决问题的办法!

所以回答我自己的问题(并希望帮助别人):

  • 文件名应该是URL的最后一部分
    .../not-this-part/but-this
  • 文件夹结构应该是URL结构的映射
    .../folder/subfolder/class
  • 和类应该定义为完整路径,但使用下划线而不是正斜杠
    class folder_subfolder_class {

然后我为每个类系统(模型,视图&;并使用spl_autoload_register()将每个函数注册为__autoload函数。因此…

<>之前loadController($class) {$path = $_SERVER['DOCUMENT_ROOT'].'/application/controller/';$filename = str_replace('_', DIRECTORY_SEPARATOR, strtolower($class)).'.php';If (file_exists($path.$filename)) {require_once(路径。文件名美元);}}等等等。spl_autoload_register("loadController");…之前

对于那些想知道mod_rewrite部分的人…

<>之前IfModule mod_rewrite.cRewriteEngine上RewriteBase/rewritecsecond %{SCRIPT_FILENAME}rewritecsecond %{SCRIPT_FILENAME}RewriteRule ^ ([a - z] +)/([a - z] +)/?美元/?页面1 = $ _ $ 2 (QSA,数控,L)RewriteRule ^ [a - z] +)/?美元/?页面= 1美元(QSA,数控,L)/IfModule