我对面向对象的PHP和MVC有点新,所以我真的需要一些帮助。使用下划线(PEAR样式)自动加载子文件夹中的php类
我有一个MVC风格的文件夹结构,在文件系统中有子文件夹
- view/classes/subfolder/classname.php
我使用mod_rewrite对人类友好的URL,如/classname
或/foldername/calssname
,随后传递到页面加载器下划线分隔值。
- 例如foldername_classname
// Page Loader File require_once($_SERVER['DOCUMENT_ROOT'].'/local/classLoader.php'); session_start(); $page = new $_REQUEST['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');
我也结束了想知道到文件夹/类映射的URL应该如何工作:
- 即URL:
/foldername/classname
mod_rewritten到
foldername_classname
;
,在
foldername
文件夹下的类文件名为
classname.php
;
和php类定义
class foldername_classname extends another_class { etc.
这是正确的方法吗?