从零开始写自己的PHP框架系列教程[前言]
我觉得程序员进步的理由:多看->多写->多总结
我自我介绍下,我不是程序员,但是我爱编程,作为业余程序员自己写框架让人感到兴奋的,目前有很多框架(js有jQuery、Express、socket.io.js等;PHP有phpword、Yii、laravel;html里面有bootstrap、bootcss、normal)。为了让别人称我为“大师”,我写框架来试试。
框架(framework)是一个基本概念上的结构,用于去解决或者处理复杂的问题。这个广泛的定义使用的十分流行,尤其在软件概念,框架也能用于机械结构。
话不多说,直接说重点:
框架适用范围:中小型网站建设、功能实现等,一个简单,缩小版的thinkphp框架
框架结构:
-核心目录
---[core.php]框架加载文件
------[cache.php]缓存文件
------[config.php]配置文件
------[controller.php]控制文件
------[hook.php]钩子文件
------[model.php]模型文件
------[route.php]路由文件
------[storage.php]储存文件
------[mysql.php]数据文件
------[template.php]模板文件
大概就是这几个类,我的思维就从这几个类开始,一步一步来写,首先设置目录,我是这样设计的:

首先要说的就是PHP的命名空间:
知识点:命名空间是一种封装事物的方法。在很多地方都可以见到这种抽象概念,对于目录中的文件来说,它就扮演了命名空间的角色。
代码案例:
namespace my\name; // 参考 "定义命名空间" 小节
class MyClass {}
function myfunction() {}
const MYCONST = 1;
$a = new MyClass;
// 参考 "全局空间" 小节
$c = new \my\name\MyClass;
知识点在空间中的运用:
我们这里主要运用在PHP的spl_autoload_register(点击就可以看到该函数的介绍)函数中,这里我们直接上代码
function auto_load($class) {
static $fileList = array();
//定义命名空间对应的路径
$prefixes =array(
'framework' => realpath(__DIR__.'/../').DIRECTORY_SEPARATOR,
'controller'=>realpath(__DIR__).'/../extend'.DIRECTORY_SEPARATOR,
'model'=>realpath(__DIR__).'/../extend'.DIRECTORY_SEPARATOR,
'hook'=>realpath(__DIR__).'/../extend'.DIRECTORY_SEPARATOR,
'admin' => ROOT_PATH,
'*' => ROOT_PATH,
);
//分割命名空间
$class = ltrim($class, '\\');
if (false !== ($pos = strrpos($class, '\\')) ){
$namespace = substr($class, 0, $pos);
$className = substr($class, $pos + 1);
//循环自动加载的目录
foreach ($prefixes as $prefix => $baseDir){
if ( '*'!==$prefix && 0!==strpos($namespace, $prefix) ) continue;
//根据namespace分割路径和文件名字
$fileDIR = $baseDir.str_replace('\\', DIRECTORY_SEPARATOR, $namespace).DIRECTORY_SEPARATOR;
if( !isset($fileList[$fileDIR]) ){
$fileList[$fileDIR] = array();
foreach(glob($fileDIR.'*.php') as $file){
$fileList[$fileDIR][] = $file;
}
}
$fileBase = $baseDir.str_replace('\\', DIRECTORY_SEPARATOR, $namespace).DIRECTORY_SEPARATOR.$className;
foreach($fileList[$fileDIR] as $file){
if( false!==stripos($file, $fileBase) ){
require $file;
return true;
}
}
}
}
return false;
}
有了这个自动加载函数我们就可以在定义命名空间后自动加载对应目录的文件
其次要说的就是实例化对象:
知识点:类的实例化就是对象。类可以大致分为一个是静态描述,另外一个是动态描述,当然还有抽象类等。我们这里不介绍
代码案例:
<?php
class Person
{
//下面是人的成员属性
var $name; //人的名字
var $sex; //人的性别
var $age; //人的年龄 //下面是人的成员方法
function say() { //这个人可以说话的方法
echo "这个人在说话";
} function run() { //这个人可以走路的方法
echo "这个人在走路";
}
} $p1=new Person();
$p2=new Person();
$p3=new Person();
?>
以上代码就是实例化的过程,静态方法及静态方法可以点击链接查看
为什么我们这里要讲类呢?如果你使用过thinkphp 你肯定知道M方法或者R方法,我们这里就要自定义这种方法,下面直接上函数
function obj($class, $layer = 'model'){
static $objArr = array();
//这里的参数$class就是命名空间
$param = explode('/', $class, 2);
$paramCount = count($param);
switch ($paramCount) {
case 1:
$app = APP_NAME;
$module = $param[0];
break;
case 2:
$app = $param[0];
$module = $param[1];
break;
}
//转换成小写字符
$app = strtolower($app);
//路径拼接
$class = "\\{$app}\\{$module}";
if(!class_exists($class)){
$class = "\\app\\{$app}\\{$layer}\\{$module}".ucfirst($layer);;
}
if(isset($objArr[$class])){
return $objArr[$class];
}
if(!class_exists($class)){
throw new \Exception("Class '{$class}' not found'", 500);
}
$obj = new $class();
$objArr[$class] = $obj;
return $obj;
}
这样就实现了空间上方法的调用,好了知识点我们讲完了,下一节就开始写框架核心
从零开始写自己的PHP框架系列教程[前言]的更多相关文章
- 从零开始写自己的PHP框架系列教程(一)[core.php]
这里我直接上代码: /** * 框架核心 */ if (version_compare(PHP_VERSION, '5.3.0','<')) { header("Content-Typ ...
- 从零开始写自己的PHP框架系列教程(二)[App.php]
从这一个文件开始以后加载的均以类加载,请注意命名空间和所在文件的路径 APP.php的这个类所在路径:根目录\framework\App.php 直接上代码 namespace framework; ...
- 老周的ABP框架系列教程 -》 一、框架理论初步学习
老周的ABP框架系列教程 -- 一.框架理论初步学习 1. ABP框架的来源与作用简介 1.1 简介 1.1.1 ABP框架全称为"ASP.NET Boilerplate ...
- webpack4 系列教程: 前言
1. 什么是webpack? 前端目前最主流的javascript打包工具,在它的帮助下,开发者可以轻松地实现加密代码.多平台兼容.而最重要的是,它为前端工程化提供了最好支持.vue.react等大型 ...
- 从零开始编写自己的C#框架 ---- 系列文章
目录: 从零开始编写自己的C#框架(1)——前言从零开始编写自己的C#框架(2)——开发前的准备工作从零开始编写自己的C#框架(3)——开发规范从零开始编写自己的C#框架(4)——文档编写说明从零开始 ...
- Java工程师之SpringBoot系列教程前言&目录
前言 与时俱进是每一个程序员都应该有的意识,当一个Java程序员在当代步遍布的时候,你就行该想到我能多学点什么.可观的是后端的框架是稳定的,它们能够维持更久的时间在应用中,而不用担心技术的更新换代.但 ...
- Java开发之上帝之眼系列教程前言&目录
前言 如果您正在为Java后端庞大的体系所困扰,如果您正在为各种繁出不穷的技术和各种框架所迷茫,那么本系列文章将带您窥探Java庞大的体系.本系列教程希望您能站在上帝的角度去观察(了解)Java体系. ...
- Java工程师之Redis实战系列教程前言&目录
系列前言 Java工程师之Redis实战系列教程,同其他教程一样,均是在下学习笔记,本系列主要参考自<Redis-in-action>,将书本中的有趣的例子转化为能解决特定问题的示例程序, ...
- cocos2d-x游戏开发系列教程-前言
cocos2d-x游戏开发前景: 最近企业对于Cocos2D-X开发人才的用人需求很大,而且所提供的薪资相当可观. 为满足广大向往游戏开发行业同学的需求,特推出适合新手的Cocos2D-X手游开发教程 ...
随机推荐
- 10、Typescript-类的基本用法
类就是构造函数的另一写法 以前构造函数的写法: 类的基本用法:
- Jenkins安装使用教程
一.说明 持续集成:Continuous integration,CI.包括两层含义,一是指项目的每个开发人员每天都向项目代码仓库要通过git等提交他们的代码,二是指在代码提交后实现自动化的构建.部署 ...
- PIL库的运用
PIL库学习及运用 1.库的介绍Python Imaging Library,简称PIL python图像处理库,这个库支持多种文件格式,并提供了强大的图像处理和图形处理能力. 下面是我的学习笔记 首 ...
- WPF实现分页控件
页面代码如下: <UserControl x:Class="Music163.DataGridPaging" xmlns="http://schemas.micro ...
- spring mvc将对象转换为json返回的配置
之前在spring 3中用的好好的MappingJacksonHttpMessageConverter转换器,将对象转为json响应给浏览器,在spring4中,报错. Cannot create i ...
- 【Java集合系列四】HashSet和LinkedHashSet解析
2017-07-29 16:58:13 一.简介 1.Set概念 Set可以理解为集合,非常类似数据概念中的集合,集合三大特征:1.确定性:2.互异性:3.无序性,因此Set实现类也有类似的特征. 2 ...
- 进程pid理解
PID(Process Identification)操作系统里指进程识别号,也就是进程标识符.操作系统里每打开一个程序都会创建一个进程ID,即PID. PID(进程控制符)英文全称为Proces ...
- C#第一课
C#是一种现代的面向对象的程序开发语言,它使得程序员能够在新的微软.NET平台上快速开发种类丰富的应用程序..NET平台提供了大量的工具和服务,能够最大限度地发掘和使用计算机通信能力. 相对于C或者C ...
- HTML 基于 Python 实现分页功能
前面的话: 1. 网页引用的bootstrap 中的表格,所以需要引入样式类 2. 第一次写文章,不喜勿喷.有不足的地方,可留言我改正,在此先谢过. HTML代码: <!DOCTYPE html ...
- 自己练习的一个小的demo的时候a标签关于href链接的问题
一.Js的几种调用方法(参考总结的) 1.a href="javascript:js_method();" 这是常用的方法,但是这种方法在传递this等参数的时候很容易出问题,而且 ...