이번에는 PHP 라우팅과 클래스 자동 로딩에 대해 알려드리겠습니다. PHP 라우팅과 클래스 자동 로딩에 대한 주의사항은 무엇인가요? 실제 사례를 살펴보겠습니다.
프로젝트 디렉토리는 다음과 같습니다
항목 파일index.php
<?php define('WEBROOT', 'C:/Users/Administrator/Documents/NetBeansProjects/test'); require_once(WEBROOT.'/core/environment.php'); coreapp::run(); //
클래스 자동 로딩 파일 Environment.php
<?php //根据类名来include文件 class loader { //找到对应文件就include static function load($name) { $file = self::filepath($name); if ($file) { return include $file; } } static function filepath($name, $ext = '.php') { if (!$ext) { $ext = '.php'; } $file = str_replace('', '/', $name) . $ext; //类名转路径 $path .= WEBROOT . '/' . $file; if (file_exists($path)) { return $path; //找到就返回 } return null; } } spl_autoload_register('loader::load');
여기 클래스에 대한 나의 로딩 규칙은 coreapp::run() </과 같습니다. 루트에 해당하는 code> /core/app.php 디렉토리의 <code>run()
메소드는 spl_autoload_register()
함수를 사용하여 특정 클래스 이름이 있을 때 자동 로딩을 구현합니다. 호출되면 자동으로 실행됩니다. < code>spl_autoload_register('loader::load'), 클래스 이름에 따라 해당 클래스 파일을 포함합니다. coreapp::run()
对应 根目录/core/app.php 的 run()
方法,用到了spl_autoload_register()
函数实现自动加载,当调用某个类名的时候,会自动执行spl_autoload_register('loader::load')
,根据类名include对应的类文件。
app.php入口文件执行的方法开始跑框架流程
<?php class coreapp { static function run() { $a = $_SERVER['REQUEST_URI']; $uri = rtrim(preg_replace('/\?.*/', '', $_SERVER['REQUEST_URI']), '/'); $params = explode('/', trim($uri, '/')); $count = count($params); if ($count > 1) { $controller = $params[0]; $method = $params[1]; } elseif ($count == 1) { $controller = 'index'; $method = $params[0]; } else { } $filename = WEBROOT . '/controller/' . $controller . '.php'; $controller = 'controller'.$controller; try { if (!file_exists($filename)) { throw new Exception('controller ' . $controller . ' is not exists!'); return; } include($filename); if (!class_exists($controller)) { throw new Exception('class ' . $controller . ' is not exists'); return; } $obj = new ReflectionClass($controller); if (!$obj->hasMethod($method)) { throw new Exception('method ' . $method . ' is not exists'); return; } } catch (Exception $e) { echo $e; //展示错误结果 return; } $newObj = new $controller(); call_user_func_array(array($newObj, $method), $params); } }
根据请求uri去找对应的controller, 用call_user_func_array()
的方式调用controller里的方法
根目录/controller/test.php
<?php class controllertest { public function write($controller, $method) { //configtest::load('test'); modeltest::write($controller, $method); } }
这里其实调用不一定要调用model里的test方法,可以调model目录下的任意文件,在此之前可以去都读一些config文件等等操作。
根目录/model/test.php
<?php class modeltest { public function write($model, $method) { echo 'From controller:'.$model.' to model: ' . $model . ' ,method: ' . $method; } }
例如hostname/test/write 这个请求就会从入口文件进来,经过coreapp::run
就会找到controller下对应的的controllertest类,执行write()
rrreee
요청 URI에 따라 해당 컨트롤러를 찾아call_user_func_array()
를 사용하여 컨트롤러에서 메서드를 호출합니다루트 디렉터리/컨트롤러/test.php
rrreee실제로 여기서 호출할 때 반드시 모델의 테스트 메서드를 호출할 필요는 없습니다. 그 전에는 일부 구성 파일을 읽을 수 있습니다. 및 기타 작업.
루트 디렉토리/model/test.php
예를 들어 호스트 이름/test/write 요청은 coreapp::run
이후에 해당 컨트롤러 테스트를 찾을 수 있습니다. 클래스 아래에 있는 write()
메소드를 실행하세요이 기사의 사례를 읽으신 후 메소드를 마스터하셨다고 생각합니다. 더 흥미로운 정보를 보려면 다음 페이지의 다른 관련 기사를 주목하세요. PHP 중국어 웹사이트!
위 내용은 PHP는 라우팅 및 클래스 자동 로딩을 구현합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!