我對面向對象的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.
這是正確的方法嗎?