This time I will bring you PHP routing and class automatic loading, what are the notes for PHP routing and class automatic loading, the following is a practical case, let’s take a look one time.
The project directory is as follows
Entry fileindex.php
<?php define('WEBROOT', 'C:/Users/Administrator/Documents/NetBeansProjects/test'); require_once(WEBROOT.'/core/environment.php'); coreapp::run(); //
The class automatically loads the file 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');
My class here The loading rule is, for example, coreapp::run()
The run()
method corresponding to the root directory/core/app.php uses the spl_autoload_register()
function To implement automatic loading, when a certain class name is called, spl_autoload_register('loader::load')
will be automatically executed to include the corresponding class file according to the class name.
The method of executing the app.php entry file starts running the framework process
<?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); } }
Find the corresponding controller according to the request uri, and use call_user_func_array()
to call the controller Method
Root directory/controller/test.php
<?php class controllertest { public function write($controller, $method) { //configtest::load('test'); modeltest::write($controller, $method); } }
In fact, the call here does not necessarily have to call the test method in the model. You can call any file in the model directory. Before that, you can go to Read some config files and other operations.
Root directory/model/test.php
<?php class modeltest { public function write($model, $method) { echo 'From controller:'.$model.' to model: ' . $model . ' ,method: ' . $method; } }
For example, the request hostname/test/write will come in from the entry file and will be found after coreapp::run
The corresponding controllertest class under the controller executes the write()
method
I believe you have mastered the method after reading the case in this article. For more exciting information, please pay attention to other related articles on the PHP Chinese website!
Recommended reading:
Detailed explanation of php retaining key values + merging arrays
Installing Apache and PHP environment in Alibaba Cloud
thinkphp method to generate url according to routing rules
The above is the detailed content of PHP implements routing and class automatic loading. For more information, please follow other related articles on the PHP Chinese website!