从零开始写自己的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手游开发教程 ...
随机推荐
- antd按需加载,配置babel-plugin-import插件,编译后报错.bezierEasingMixin()解决方案
报错如下: ./node_modules/antd/lib/button/style/index.less (./node_modules/css-loader??ref--6-oneOf-7-1!. ...
- 小程序getLocation出现的各种问题汇总
1.小程序无法弹出授权位置的弹框: 需要在app.json中增加相关配置文件: "permission": { "scope.userLocation": { ...
- @validated各种坑
1.@validate不起作用 经过各种测试,在@validate后加了个modelattribute("form")就不验证了,坑.. 2.错误信息的properties配置文件 ...
- springboot之jackson的两种配置方式
springboot 针对jackson是自动化配置的,如果需要修改,有两种方式: 方式一:通过application.yml 配置属性说明:## spring.jackson.date-format ...
- windows WebStorm常用快捷键记录,常用的都在这儿找扒
~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Webstorm version 2018.2 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1. Ctrl + Shift + ...
- gevent模块学习(四)
gevent.spawn会对传入的子任务集合进行调度,gevent.joinall 方法会阻塞当前程序,除非所有的greenlet都执行完毕,才会退出程序 公有方法 gevent.spawn(cls, ...
- IO多路复用版FTP
需求: 实现文件上传及下载功能 支持多连接并发传文件 使用select or selectors 流程图 import socket import pickle import sys import t ...
- zabbix实现对磁盘性能动态监控
前言 zabbix一直是小规模互联网公司服务器性能监控首选,首先是免费,其次,有专门的公司和社区开发维护,使其稳定性和功能都在不断地增强和完善.zabbix拥有详细的UI界面和分组策略,在被监控的服务 ...
- JS(JAVASCRIPT)
2018-08-17 * JAVASCRIPT(JavaScript简写js,文件的后缀名也是 demo.js)(*****) * javascript的简介 * js是基于对象和事件驱动的脚本语言, ...
- linux常用命令 wc统计命令
统计命令wc wc [选项] 文件名 选项 -l 只统计行数 -w 只统计单词数 -m 只统计字符数 192:linux_worspace aouo$ wc /etc/passwd 103 ...