使用下划线(PEAR样式)表示法从子文件夹自动加载php类
我对面向对象的PHP和MVC有点陌生,所以我真的需要一些帮助 我有一个MVC风格的文件夹结构,文件系统中有子文件夹使用下划线(PEAR样式)表示法从子文件夹自动加载php类,php,oop,mod-rewrite,autoload,Php,Oop,Mod Rewrite,Autoload,我对面向对象的PHP和MVC有点陌生,所以我真的需要一些帮助 我有一个MVC风格的文件夹结构,文件系统中有子文件夹 -例如view/classes/subfolder/classname.php 我对人性化URL使用mod_rewrite,如/classname或/foldername/calssname,然后将它们作为下划线分隔的值传递给页面加载器。 -例如foldername\u classname // Page Loader File require_once($_SERVER['DOC
-例如
view/classes/subfolder/classname.php
我对人性化URL使用mod_rewrite,如/classname
或/foldername/calssname
,然后将它们作为下划线分隔的值传递给页面加载器。-例如
foldername\u classname
// Page Loader File
require_once($_SERVER['DOCUMENT_ROOT'].'/local/classLoader.php');
session_start();
$page = new $_REQUEST['page'];
//页面加载程序文件
需要_once($_SERVER['DOCUMENT_ROOT']./local/classLoader.php');
会话_start();
$page=新的$_请求['page'];
我以前在每个可能的文件夹中使用[if/else if/else]块进行测试,但这似乎效率低下,因此我正在寻找一种更好的方法,让自动加载器在许多不同的位置进行测试
这是我最近的一次失败,它没有找到任何请求的类,只为每个类输出一个异常,最终导致一个致命错误!:
function classToPath($class) {
$path = str_replace('_', '/', $class) . '.php';
return $path;
}
function autoloadController($class) {
echo 'LoadController'.''; $root = '/controller/classes/'; $pathtoclass = $root.classToPath($class); try { if( file_exists($pathtoclass) ) require_once($pathtoclass); else throw new Exception('Cannot load controller '.$class); } catch(Exception $e) { echo 'Controller exception: ' . $e->getMessage() . "
"; } } function autoloadModel($class) { echo 'LoadModel'.'
'; $root = '/model/classes/'; $pathtoclass = $root.classToPath($class); try { if( file_exists($pathtoclass) ) require_once($pathtoclass); else throw new Exception('Cannot load model '.$class); } catch(Exception $e) { echo 'Model exception: ' . $e->getMessage() . "
"; } } function autoloadView($class) { echo 'LoadView'.'
'; $root = '/view/classes/'; $pathtoclass = $root.classToPath($class); try { if( file_exists($pathtoclass) ) require_once($pathtoclass); else throw new Exception('Cannot load view '.$class); } catch(Exception $e) { echo 'View exception: ' . $e->getMessage() . "
"; } } spl_autoload_register('autoloadController'); spl_autoload_register('autoloadModel'); spl_autoload_register('autoloadView'); 函数classToPath($class){ $path=str_replace(“",“/”,$class)。“.php”; 返回$path; } 函数autoloadController($class){ 回显“LoadController”。
; $root='/controller/classes/'; $pathtoclass=$root.classToPath($class); 试一试{ 如果(文件_存在($pathtoclass))需要_一次($pathtoclass); else抛出新异常('无法加载控制器'.$class'); }捕获(例外$e){ 回显“控制器异常:”。$e->getMessage()。“
”; } } 函数AutolodModel($class){ 回显“LoadModel”。
; $root='/model/classes/'; $pathtoclass=$root.classToPath($class); 试一试{ 如果(文件_存在($pathtoclass))需要_一次($pathtoclass); else抛出新异常('无法加载模型'.$class'); }捕获(例外$e){ 回显“模型异常:”。$e->getMessage()。“
”; } } 函数autoloadView($class){ 回显“加载视图”。
; $root='/view/classes/'; $pathtoclass=$root.classToPath($class); 试一试{ 如果(文件_存在($pathtoclass))需要_一次($pathtoclass); else抛出新异常('无法加载视图'.$class'); }捕获(例外$e){ 回显“查看异常:”。$e->getMessage()。“
”; } } spl_自动加载_寄存器(“自动加载控制器”); spl_自动加载_寄存器(“AutolodModel”); spl_自动加载_寄存器('autoloadView');
我还想知道URL到文件夹/类的映射应该如何工作:
-即URL:
/foldername/classname
mod_重写为foldername_classname
在
foldername
文件夹下,类文件名为classname.php
class foldername\u classname的php类定义扩展了另一个\u类{等。
这是正确的方法吗?我发现这是一个偶然的机会,与……有关 因此,要回答我自己的问题(并希望帮助他人):
- 文件名应该只是URL的最后一部分
也就是说,../不是这个部分,而是这个
- 文件夹结构应该是URL结构的映射
例如,../folder/subfolder/class
- 该类应该定义为完整路径,但使用下划线而不是正斜杠
例如类文件夹\u子文件夹\u类{
spl\u autoload\u register()
将每个函数注册为\u autoload
函数
function loadController($class) {
$path = $_SERVER['DOCUMENT_ROOT'].'/application/controller/';
$filename = str_replace( '_', DIRECTORY_SEPARATOR, strtolower($class) ).'.php';
if( file_exists($path.$filename) ) {
require_once($path.$filename);
}
}
etc..etc..
spl_autoload_register('loadController');
...
我发现,这是一个偶然的机会 因此,要回答我自己的问题(并希望帮助他人):
- 文件名应该只是URL的最后一部分
也就是说,../不是这个部分,而是这个
- 文件夹结构应该是URL结构的映射
例如,../folder/subfolder/class
- 该类应该定义为完整路径,但使用下划线而不是正斜杠
例如类文件夹\u子文件夹\u类{
spl\u autoload\u register()
将每个函数注册为\u autoload
函数
function loadController($class) {
$path = $_SERVER['DOCUMENT_ROOT'].'/application/controller/';
$filename = str_replace( '_', DIRECTORY_SEPARATOR, strtolower($class) ).'.php';
if( file_exists($path.$filename) ) {
require_once($path.$filename);
}
}
etc..etc..
spl_autoload_register('loadController');
...