LUCKY

Welcome to Us !

写一个自己的PHP框架(一)

lucky PHP 2019/10/29

前言

本人也是一个菜鸟,但是没人规定菜鸟就不能写一个自己的PHP的框架了,如果有写的不好或者不合理的地方,望指出。

背景

我为什么要写一个属于自己的框架那?

1.可以学习面向对象编程和MVC设计模式

2.可以更好了解框架的流程(更好的装逼)

那什么又是MVC那?网上一搜一堆,我就说一下自己 的理解,不对别喷我

模型Model->管理业务逻辑处理,数据库的交互

控制器Controller->接受用户提交的参数,处理用户请求展示数据

视图View->负责数据的渲染,展现给用户
目录


这是项目的目录结构

开始

我们在public下面新建一个index.php的文件(入口文件):

<?php
//入口文件
define('APP_PATH', str_replace('\\','/',realpath(__DIR__ . '/../')));//定义根目录
define('CORE', APP_PATH.'/core');//定义框架核心目录
require CORE.'/base.php';

里面定义了项目的根目录和核心目录,引入了base.php。

接下来我们在core下面新建一个base.php文件:

<?php
define('APP', 'app\\');
define('APP_DEBUG', true);
define('ENV_PREFIX', 'PHP_'); // 环境变量的配置前缀
include CORE.'/common/function.php';//加载全局方法
include CORE.'/fast/App.php';//加载App.php并调用里面的静态方法run
\core\fast\APP::run();

接下来在core下面新建一个文件fast和App.php:

<?php
namespace core\fast;
use core\fast\Conf;

/**
 * 框架核心
 */
class App 
{
	public static $classArray =[];
	public function __construct()
	{
		# code...
	}
	public static function run( ){ 
		spl_autoload_register('self::loadClass');
		self::setReporting();
		//加载路由类
		new \core\fast\route();
	}
	//自动加载
	public static function loadClass($className){
		if(isset(self::$classArray[$className])){
			return true;
		}else {
			 	$class = APP_PATH . '/'.str_replace('\\', '/', $className) . '.php';
				if(is_file($class)){
				include $class;
				self::$classArray[$className] = $className;
				}else{
					return false;
				}
		}
	}

	// 检测开发环境
    public static function setReporting()
    {
        if (APP_DEBUG === true) {
            error_reporting(E_ALL);
            ini_set('display_errors','On');
        } else {
            error_reporting(E_ALL);
            ini_set('display_errors','Off');
        }
    }
}

这个里面主要做了以下操作

1.类的自动加载

2.检查开发环境

3.加载了路由类

接下来就是路由类了,在fast下面新建一个rout.php文件:

<?php
namespace core\fast;
use core\fast\Conf;

/**
 * 路由处理
 */
class Route 
{
	public  $moduleName;//前台还是后台的文件名
	public  $controllerName;//访问控制器名
	public  $actionName;//访问的方法名
	public function __construct(){
		/**
		解析路由
		**/
		if(isset($_SERVER['REQUEST_URI']) && $_SERVER['REQUEST_URI'] != '/'){
			$url = $_SERVER['REQUEST_URI'];
			//去掉?后面的值
			$newurl = strpos($url, '?');
			$url = $newurl === false?$url:substr($url,0,$newurl);
			//链接是否存在index.php
			$newurl = strpos($url, 'index.php');
			if($newurl !== false){
				$url = substr($url,$newurl+strlen('index.php'));
			}
			//分割字符
			$path = explode('/',trim($url,'/'));
			//去除空的数组
			$pathArray = array_filter($path);
			if(count($pathArray) == 3){
				$this->moduleName = strtolower($pathArray[0]);
				array_shift($pathArray);
			}else{
				$this->moduleName = 'index';
			}
			//获取控制器名  把首字符大写
			$this->controllerName = ucfirst(strtolower($pathArray[0]));
			//删除第一个控制名
			array_shift($pathArray);
			//获取方法如果无则用默认的
			$this->actionName = $pathArray?$pathArray[0]:'index';
		}else{
			$this->moduleName     = 'index';
			$this->controllerName = 'Index';
			$this->actionName     = 'index';
		}
		$ctrlClass = APP.'controllers\\'. $this->moduleName .'\\' .$this->controllerName;
		//是否存在控制器
		if(class_exists($ctrlClass)){
			$file = new $ctrlClass($this->moduleName,$this->controllerName,$this->actionName);
			//是否存在方法
			if(method_exists($ctrlClass,$this->actionName)){
				$action = $this->actionName;
				$file->$action();
			}else{
				throw new \Exception("这个方法不存在".$this->actionName);
			}

		}else{
			throw new \Exception("没有这个控制器".$this->controllerName);
			
		}
	}


}

这里只做了一件事,就是解析路由,解析出控制器和方法名。

接下来就是建立controller,在app\controller\index下面建立一个index.php:

<?php
namespace app\controllers\index;

class Index 
{
	public function index(){
            echo '这是index';
	}
	public function demo(){
	    echo '这是demo';
	}
}

这里新建了两个方法,接下来我们访问以下,

我输入http://www.demophp.nn/(这是我自己再本地建立虚拟域名)会显示

这就说明我们的路由类成功,接下来在测试一下别的

当我访问demo的时候,它输出就是我们刚刚写在方法里面的值,这样我们的路由类算是成功了。

下一期就讲讲视图。