Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用下划线(PEAR样式)表示法从子文件夹自动加载php类_Php_Oop_Mod Rewrite_Autoload - Fatal编程技术网

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

使用下划线(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

我对面向对象的PHP和MVC有点陌生,所以我真的需要一些帮助

我有一个MVC风格的文件夹结构,文件系统中有子文件夹
-例如
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'); ...