Chr*_*ris 1 php oop mod-rewrite autoload
我对面向对象的 PHP 和 MVC 有点陌生,所以我真的需要一些帮助。
我有一个 MVC 风格的文件夹结构,文件系统中有子文件夹
- 例如view/classes/subfolder/classname.php
我将 mod_rewrite 用于人类友好的 URL, as/classname
或/foldername/calssname
,然后将其作为下划线分隔值传递给页面加载器。
- 例如foldername_classname
// 页面加载器文件 require_once($_SERVER['DOCUMENT_ROOT'].'/local/classLoader.php'); session_start(); $page = new $_REQUEST['page'];
我以前一直在使用 [if / else if / else] 块来测试每个可能的文件夹,但这似乎效率低下,所以我正在寻找一种更好的方法让自动加载器在许多不同的位置查看。
这是我最近的失败,它没有找到任何请求的类,只是输出一个异常,每个类都以致命错误告终!:
函数 classToPath($class) { $path = str_replace('_', '/', $class) 。'.php'; 返回 $path; } 函数自动加载控制器($class){ echo 'LoadController'.'
'; $root = '/控制器/类/'; $pathtoclass = $root.classToPath($class); 尝试 { if(file_exists($pathtoclass)) require_once($pathtoclass); else throw new Exception('无法加载控制器'.$class); } catch(异常$e) { echo '控制器异常:'。$e->getMessage() 。”
”; } } 函数自动加载模型($class){ echo 'LoadModel'.'
'; $root = '/model/classes/'; $pathtoclass = $root.classToPath($class); 尝试 { if(file_exists($pathtoclass)) require_once($pathtoclass); else throw new Exception('无法加载模型'.$class); } catch(异常$e) { echo '模型异常:'。$e->getMessage() 。”
”; } } 函数 autoloadView($class) { 回声“加载视图”。
'; $root = '/view/classes/'; $pathtoclass = $root.classToPath($class); 尝试 { if(file_exists($pathtoclass)) require_once($pathtoclass); else throw new Exception('无法加载视图'.$class); } catch(异常$e) { echo '查看异常:'。$e->getMessage() 。“
”; } } spl_autoload_register('autoloadController'); spl_autoload_register('autoloadModel'); spl_autoload_register('autoloadView');
/foldername/classname
mod_rewritten to foldername_classname
;classname.php
下的类文件名foldername
;class foldername_classname extends another_class { etc.
这是正确的方法吗?
因此,要回答我自己的问题(并希望对其他人有所帮助):
.../not-this-part/but-this
.../folder/subfolder/class
class folder_subfolder_class {
然后我为每个类系统(模型、视图和控制器)编写了一个函数,并用于spl_autoload_register()
将每个函数注册为一个__autoload
函数。因此...
函数负载控制器($class){ $path = $_SERVER['DOCUMENT_ROOT'].'/application/controller/'; $filename = str_replace('_', DIRECTORY_SEPARATOR, strtolower($class)).'.php'; 如果(文件存在($path.$filename)){ require_once($path.$filename); } } 等等等等。 spl_autoload_register('loadController'); ...
对于那些想知道这mod_rewrite
部分的人......
IfModule mod_rewrite.c 重写引擎开启 重写基数 / RewriteCond %{SCRIPT_FILENAME} !-f RewriteCond %{SCRIPT_FILENAME} !-d 重写规则 ^([az]+)/([az]+)/?$ /?page=$1_$2 [QSA,NC,L] 重写规则 ^([az]+)/?$ /?page=$1 [QSA,NC,L] /If 模块