从零开始写自己的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手游开发教程 ...
随机推荐
- A*算法介绍
你是否在做一款游戏的时候想创造一些怪兽或者游戏主角,让它们移动到特定的位置,避开墙壁和障碍物呢? 如果是的话,请看这篇教程,我们会展示如何使用A星寻路算法来实现它! 在网上已经有很多篇关于A星寻路算法 ...
- Bootstrap4 导航栏
Bootstrap4 导航栏 目录 Bootstrap4 导航栏 动态选项卡 标准的导航栏 导航对齐方式 导航栏的组成 ul 元素中包含navbar-nav 类 表示导航栏中ul li元素中包含nav ...
- 多条件分类统计group by 显示数目为0的类别
CREATE TABLE #authorTable(author VARCHAR(50)) INSERT #authorTable SELECT 'peter' UNION SELECT '捌妮' U ...
- 泛在电力物联网建设大纲ppt
“三型两网”,国家电网在2019年提出的新战略目标.其中,“两网”分别代表着,“坚强智能电网”和“泛在电力物联网”.“坚强智能电网”的概念已经随着特高压的持续建设而被大家渐渐熟知,那么“泛在电力物联网 ...
- Java 开发笔记
共同学习,以下内容,随时更新. 前端 1.前端页面'是单引号的转义符,"是双引号. 问题(前端JS进行参数传递时,使用的是单引号扩住变量,但是变量形式为 2019-27 ...
- 微信中扫描二维码自动打开手机系统默认浏览器下载APP(APK)
很多朋友问我怎么解决微信内点击链接或扫描二维码可以直接跳出微信在外部浏览器打开网页链接,其实这并不难,只要我们实现微信跳转功能即可.下面给大家介绍这个功能 功能目的 生成微信跳转链接,实现微信内置浏览 ...
- 生成git,ssh的key
git clone ssh 代码: 报错: Warning: Permanently added 'gitee.com,120.55.226.24' (ECDSA) to the list of kn ...
- Java内存溢出优化性能优化
高性能应用构成了现代网络的支柱.LinkedIn有许多内部高吞吐量服务来满足每秒数千次的用户请求.要优化用户体验,低延迟地响应这些请求非常重要. 比如说,用户经常用到的一个功能是了解动态信息——不断更 ...
- 如何安全的捂住你的AngelToken钱包
Angel Token钱包的重要性 AngelToken基于区块链底层技术的去中心化.安全可靠的特点,开发了数字资产钱包,是行业领先的中心化token钱包和去中心化交易平台相结合的链数字资产智能钱包. ...
- Python turtle安装和使用教程
1 安装turtle Python2安装命令: pip install turtule Python3安装命令: pip3 install turtle 因为turtle库主要是在Python2中使用 ...