从零开始写自己的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手游开发教程 ...
随机推荐
- SQL server 数据库的版本为661,无法打开,此服务器只支持655版及更低版本。不支持降级路径
亲测有效. 解决方案:造成这个错误是因为把本地的SQL Server (MSSQLSERVER)服务给禁止了,而把 SQL Server (SQLEXPRESS)服务给启动了,因为这样子,本来应该在数 ...
- ES5 & ES6 基础
一.什么是ES5 附上一览表 (5.1中文 (2011.6)): http://lzw.me/pages/ecmascript/ (5.1英文PDF):http://www.ecma-internat ...
- Spring框架中获取连接池的几种方式
什么是数据库连接池? 数据库连接池是一种关键的有限的昂贵的资源,对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标.数据库连接池就是用来解决这些问题而提出的. 数据库连接 ...
- 2015-11-03 ado.net3
DataReader和DateSet区别: 1. DataReader是一行一行的读,且只能向前读.DateSet是一次性读取出来放到内存中,所以,DataReader读取速度更快,占用内存更低. 2 ...
- centos7上搭建http服务器以及设置目录访问
参考文献:http://www.jb51.net/article/137596.htm,原文摘抄如下,并根据具体需要作了相应的修改. 步骤: 1. 安装httpd服务 sudo yum install ...
- mysql查询表字段名称,字段类型
select column_name,column_comment,data_type from information_schema.columns where table_name='查询表名称' ...
- 第二课 --- git的(管理修改和撤销修改、删除文件)
读取文本内容: cat readme.txt 查看工作区与脚本库里面的区别: git diff HEAD -- readme.txt 丢弃工作区的修改内容: git checkout -- readm ...
- python3 发送gzip文件请求
#condig=utf-8import requestsimport json,gzip def toGzipFormat(postData): data=bytes(json.dumps(postD ...
- S2T40,第四章,简答5
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- c#基础之异常处理及自定义异常
一.什么是c#中的异常? 异常是程序运行中发生的错误,异常处理是程序的一部分.c#中的异常类主要是直接或者间接的派生于 System.Exception类 ,也就是说System.Exception类 ...