Home > Backend Development > PHP Tutorial > PHP framework development 2 (SPL library and controller)_PHP tutorial

PHP framework development 2 (SPL library and controller)_PHP tutorial

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
Release: 2016-07-13 17:53:04
Original
896 people have browsed it

According to the directory structure mentioned above (if you are not sure, you can read the previous article). I created a new simple.php.

in the simple folder

[php]

require 'includes/exceptions.php';
require 'includes/autoloader.php';
session_start();

//$view = new view();
lib::set_item('controller' , new controller());
lib::get_item('controller' , lib::PERSIST_STORGE)->render();
//$content = $view->finish();


This chapter mainly talks about SPL, so we only look at the second line of autoloader.php. When we add

to index.php

[php]
require 'simple/simple.php';
after.

Let’s take a look at the source code of autoloader.php

[php]
class autoloader{
       
Public static function includesautoloader($class){
         $path = defined('SIMPLE_PATH') ? SIMPLE_PATH : $_SERVER['DOCUMENT_ROOT'];
$file_name = $path . '/includes/' . $class . '.php';
If(is_readable($file_name))
               require $file_name;
}  
       
Public static function modulesautoloader($class){
         $path = defined('SIMPLE_PATH') ? SIMPLE_PATH : $_SERVER['DOCUMENT_ROOT'];
$file_name = $path . '/modules/' . $class . '.php';
If(is_readable($file_name))
               require $file_name;
}  
       
Public static function controllerautoloader($class){
         $path = defined('SIMPLE_PATH') ? SIMPLE_PATH : $_SERVER['DOCUMENT_ROOT'];
$file_name = $path . '/controller/' . $class . '.php';
If(is_readable($file_name))
               require $file_name;
}  

}

spl_autoload_register('autoloader::includesautoloader');
spl_autoload_register('autoloader::modulesautoloader');
spl_autoload_register('autoloader::controllerautoloader');

This class has static methods. When this PHP file is referenced, the program will automatically load the contents of these three folders, so that we do not need to require or include repeatedly. If you don’t know anything about SPL, you can go directly to Baidu. I’m just telling you that this SPL has a wide range of functions.

Then create a new lib.php in the includes folder

[html]
class lib{ 
     
    const SETTING_ARRAY = true; 
    const PERSIST_STORGE = false; 
     
    public static function set_item($name , $value , $is_array = false){ 
        if($is_array){ 
            $_SESSION[$name]   = array(); 
            $_SESSION[$name][] = $value; 
        } 
        else{ 
            $_SESSION[$name] = $value; 
        } 
    } 
     
    public static function get_item($name , $persist = true){ 
        $result = null; 
        if(isset($_SESSION[$name])){ 
            $result = $_SESSION[$name]; 
        } 
        if(!$persist){ 
            unset($_SESSION[$name]); 
        } 
        return $result; 
    } 
     
    public static function sendto($url = ''){ 
        if(empty($url)){ 
            $url  = '/'; 
        } 
        die(header('Location:' . $url)); 
    } 

这个类目前只用于设置SESSION相关的内容。

当执行到lib::set_item('controller' , new controller());时,这里新建了一个控制器对象,并对象存入SESSION中。

controller.php

[php] 
class controller{ 
    //URL部分 
    protected $parts; 
    //方法参数 
    protected $params; 
     
    public function __construct(){ 
        $this->parts = array(); 
        $this->analysis(); 
    } 
     
    public function analysis(){ 
        $path_info = $_SERVER['PATH_INFO']; 
        if(substr($path_info , 0 , 1) == '/'){ 
            $path_info = substr($path_info , 1); 
        } 
        $parts = explode('/' , $path_info); 
        if(emptyempty($parts[0]))  $parts[0] = 'index'; 
        if(emptyempty($parts[1]))  $parts[1] = 'demo'; 
         
        $this->parts = $parts; 
        array_shift($parts); 
        array_shift($parts); 
        $this->params = $parts; 
    } 
     
    public function render(){ 
        if(!class_exists($this->parts[0])){ 
            throw new ControllerDoesntExistsException($this->parts[0] . ' not exists!'); 
        } 
        if(!method_exists($this->parts[0] , $this->parts[1])){ 
            throw new ActionDoesntExistsException($this->parts[0] . 'of ' . $this->parts[1] . ' not exists!'); 
        } 
         
        $new_controller = new $this->parts[0]; 
        $called = call_user_func_array(array($new_controller , $this->parts[1]) , $this->params); 
        if($called === false){ 
            throw new ActionFailedException($this->parts[0] . 'of ' . $this->parts[1] . ' failed to excute property!'); 
        } 
    } 

这个类只用PATH_INFO模式来获取调用的控制器和ACTION,并将参数传递到相应的ACTION方法里。当controller初始化之后,会自动分析PATH_INFO的内容,

lib::get_item('controller' , lib::PERSIST_STORGE)->render();

然后调用render()就会在相应的控制器目录找到控制器和ACTION。

例如我在controller文件夹内新建一个index.php

[php] 
class index{ 
     
    public function demo(){ 
        echo "sdfsdf"; 
    } 

那么执行http://localhost/index.php/index/demo就会输出"sdfsdf";(这是我的本地路径)。

 

以上代码难度不高,如果没有看懂的同学,请Q我,也可以去PHP官网上去查找相应函数的用法。

下一节相会对视图作一个简单的介绍。
 作者:tomyjohn

www.bkjia.comtruehttp: //www.bkjia.com/PHPjc/478065.htmlTechArticleAccording to the directory structure above (if you are not sure, you can read the previous article). I created a new simple.php in the simple folder. [php] prequire includes/exceptions.php; require includes/...
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Latest Issues
php data acquisition?
From 1970-01-01 08:00:00
0
0
0
PHP extension intl
From 1970-01-01 08:00:00
0
0
0
How to learn php well
From 1970-01-01 08:00:00
0
0
0
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template