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

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');



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

这是正确的方法吗?

Chr*_*ris 5

而是偶然地,与另一件事有关,我找到了解决问题的方法

因此,要回答我自己的问题(并希望对其他人有所帮助):

  • 文件名应该只是 URL 的最后一部分,
    .../not-this-part/but-this
  • 文件夹结构应该是 URL 结构的映射,
    例如.../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 模块