惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

V2EX - 技术
V2EX - 技术
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
T
Threat Research - Cisco Blogs
T
The Exploit Database - CXSecurity.com
S
Schneier on Security
S
Securelist
P
Privacy & Cybersecurity Law Blog
Scott Helme
Scott Helme
T
Threatpost
C
Cybersecurity and Infrastructure Security Agency CISA
L
LINUX DO - 热门话题
Cyberwarzone
Cyberwarzone
Cisco Talos Blog
Cisco Talos Blog
量子位
博客园 - Franky
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Latest news
Latest news
T
Troy Hunt's Blog
N
News | PayPal Newsroom
Google Online Security Blog
Google Online Security Blog
Apple Machine Learning Research
Apple Machine Learning Research
N
Netflix TechBlog - Medium
小众软件
小众软件
P
Palo Alto Networks Blog
Spread Privacy
Spread Privacy
C
Cyber Attacks, Cyber Crime and Cyber Security
C
Check Point Blog
aimingoo的专栏
aimingoo的专栏
WordPress大学
WordPress大学
L
Lohrmann on Cybersecurity
L
LINUX DO - 最新话题
D
Darknet – Hacking Tools, Hacker News & Cyber Security
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
The Last Watchdog
The Last Watchdog
S
Security @ Cisco Blogs
P
Privacy International News Feed
Last Week in AI
Last Week in AI
Microsoft Security Blog
Microsoft Security Blog
T
Tailwind CSS Blog
博客园_首页
云风的 BLOG
云风的 BLOG
V
Vulnerabilities – Threatpost
D
DataBreaches.Net
Recent Announcements
Recent Announcements
酷 壳 – CoolShell
酷 壳 – CoolShell
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
罗磊的独立博客
Engineering at Meta
Engineering at Meta
Forbes - Security
Forbes - Security
T
Tenable Blog

青空之蓝

[青空之蓝-2023] - 色彩 | 青空之蓝 [青空之蓝-2022] - 平静 | 青空之蓝 [青空之蓝-2021] - 远望 | 青空之蓝 浅谈垃圾回收 | 青空之蓝 浅谈泛型擦除 | 青空之蓝 浅谈单点登录 | 青空之蓝 使用 Kotlin 编写 Spring 测试 | 青空之蓝 设计模式系列文章 | 青空之蓝 从零实现一个 Java 微框架 - IoC | 青空之蓝 从零实现一个 Java 微框架 - 前言 | 青空之蓝 浅谈 JVM:类加载 | 青空之蓝 浅谈 IO | 青空之蓝 浅谈并发:synchronized & ReentrantLock | 青空之蓝 浅谈并发:CAS & AQS | 青空之蓝 浅谈并发:ThreadLocal | 青空之蓝 浅谈并发:三大特性 | 青空之蓝 浅谈组合注解 & 注解别名 | 青空之蓝 [青空之蓝-2020]-迷茫 | 青空之蓝 Java 系列文章 | 青空之蓝 HTTP 系列文章 | 青空之蓝 浅谈 EatWhatYouKill | 青空之蓝 浅谈可扩展线程池 | 青空之蓝 聊聊写框架 | 青空之蓝 聊聊现状-[2020-09] | 青空之蓝 浅谈并发:锁 | 青空之蓝 浅谈并发:基础 | 青空之蓝 浅谈缓存 | 青空之蓝 无须定义类,Spring 快速注入 Json 参数 | 青空之蓝 浅谈 Proxy 和 Aop | 青空之蓝 从零实现一个 PHP 微框架 - 初始化请求 | 青空之蓝 为 Vue3 添加一个简单的 Store | 青空之蓝 从零实现一个 PHP 微框架 - 服务提供者 | 青空之蓝 WSL2 踩坑记录 | 青空之蓝 浅谈浏览器Event Loop [更新] | 青空之蓝 从零实现一个 PHP 微框架 - Bootstrap 启动加载 | 青空之蓝 从零实现一个 PHP 微框架 - IoC 容器 | 青空之蓝 从零实现一个 PHP 微框架 - 前言 | 青空之蓝 MVVM 简单实现 | 青空之蓝 浅谈 DI 和 IoC | 青空之蓝 中间件实现 [PHP] | 青空之蓝 告别 Windows 终端的难看难用,打造好用的 PowerShell | 青空之蓝 VSCode Java输出中文乱码问题解决[更新] | 青空之蓝 浅谈浏览器渲染 | 青空之蓝 Vue-Cli@2 项目迁移日志 | 青空之蓝 Laragon & Scoop 集成踩坑记录 | 青空之蓝 「一行代码」优雅管理 Windows 软件 | 青空之蓝 [青空之蓝-2019]-年度总结 | 青空之蓝 为Vue添加简单的Store | 青空之蓝 为React添加简单的Store | 青空之蓝 为Vuex添加同步Action | 青空之蓝 浅谈B+树 | 青空之蓝 浅谈跳表 | 青空之蓝 浅谈数据库索引 | 青空之蓝 MySQL事务隔离 | 青空之蓝 算法复杂度分析(1) | 青空之蓝 一年来的经验总结 | 青空之蓝 Acrylic - VSCode Extension | 青空之蓝 ace编辑器设置惯性滚动 | 青空之蓝 Java二叉树实现 | 青空之蓝 Java图实现 | 青空之蓝 为apt方式安装的nginx重新编译增加WebDAV | 青空之蓝 XK-Editor - 一个支持富文本和Markdown的编辑器 | 青空之蓝 JS生成列表树 | 青空之蓝 Laravel生成目录树 | 青空之蓝 XK-Note - 集各种神奇功能的云笔记 | 青空之蓝 PHP GD生成验证码 | 青空之蓝 PHP GD图片处理[转换格式-水印-缩略图] | 青空之蓝 Origami - 简洁轻快的WordPress主题 | 青空之蓝 为WordPress启用WorkBox | 青空之蓝 [青空之蓝-2018]-年度总结 | 青空之蓝 VSCode Java手动导入jar和源码包 | 青空之蓝 Windows IP变化自动发送邮件 | 青空之蓝 C链表实现重制版 | 青空之蓝 C 结构体的定义和使用 | 青空之蓝 图的搜索(遍历) - BFS & DFS | 青空之蓝 Java链表实现 | 青空之蓝 C 快速排序 | 青空之蓝 C 插入排序 | 青空之蓝 C 归并排序 | 青空之蓝 C语言链表实现 | 青空之蓝 VSCode配置Java调试环境[Windows] | 青空之蓝 C 选择排序 | 青空之蓝 C 冒泡排序 | 青空之蓝 VSCode配置PHP调试环境[Windows] | 青空之蓝 VSCode配置C/C++ GDB调试环境[Windows] | 青空之蓝 WordPress友情链接模板 | 青空之蓝 Intel Optane 傲腾内存体验 | 青空之蓝 Mysql双机热备实战 | 青空之蓝 博客一年记录 | 青空之蓝 为WordPress启用Service Worker | 青空之蓝 Bing每日一图API | 青空之蓝 iframe延迟加载 | 青空之蓝 写在2018年高考前 | 青空之蓝 The Fox主题汉化分享 | 青空之蓝 [青空之蓝-2017]-崭新 | 青空之蓝 本博客评论规则 | 青空之蓝 世界,您好! | 青空之蓝
从零实现一个 PHP 微框架 - PSR & Composer | 青空之蓝
Otstar Lin · 2020-05-09 · via 青空之蓝

什么是 PSR?

如果你不是刚入门 PHP 新手,那么你应该已经知道了 PSR 标准,不过为了照顾到不清楚的同学,这里还是要介绍一下。

PSR 即 PHP Standard Recommendations (PHP 推荐标准)的简写,由 PHP-FIG 组织制定的 PHP 规范,是 PHP 开发的实践标准。类似于 Java 的 JSR 标准,它提供了 PHP 编程概念的标准化。目的是通过各框架作者之间的讨论制定一个标准,各框架都应遵循该规范进行开发,避免了不同框架自行发展阻碍了 PHP 的发展。

PSR 标准:Github(英文) LearnKu(中文)

什么是 Composer?

Composer 我应该不用介绍了吧?(逃

Composer 是 PHP 的一个依赖管理工具。类似于 NodeJS 的 NPM,是用来管理依赖包的。为什么需要依赖管理呢?当我们开发一个项目的时候,总会用到一些第三方的 Library,而不同的 Library 的安装方式都不相同,使用的方式也不相同。但是可被复用的代码集或功能集,都应该以一致的方式编写和声明,并且发布到云端的仓库中。这样能够减少使用者的了解与学习成本,并且能够通过工具来管理。而包管理器就是那个工具,通过包管理器,我们可以以一致的方式引入 Library使用 Library,当我们不需要的时候又能轻易的卸载不需要的 Library

自动加载

PSR-4 自动加载规范 是一个给 PHP 自动加载器将命名空间映射到文件系统的规则,PSR-4 是对 PSR-0 的补充,PSR-4 是为了解决 Composer 目录层次的问题。

写 PHP 最麻烦的就是 requireinclude 了,而有了自动加载,我们就不需要再写麻烦的 require/include 了,利用 spl_autoload_register PHP 就会在需要的时候自动加载,同时也不会遗漏或者把不必要的类加载进来,同时也不会因为大量的类而编写庞大的 require/include 代码。

自动加载带来的好处:

  • 使用类或代码前无需使用 require/include
  • 但有使用的时候才会 require/include,实现了懒加载。避免了遗漏和多余。
  • 无需考虑路径的问题,我们只需要按照规范编写代码即可。

初始化项目

利用 Composer 我们就无需直接编写自动加载器的规则,只需按照 PSR-4 的标准编写代码,Composer 会在我们需要的时候自动加载类和代码。

首先我们先找个一个文件夹,然后用 IDEA 打开它(你也可以用 PhpStorm,VSCode 等编辑器),然后打开终端,输入:

composer init
composer init

输入信息后 Composer 会在项目根目录(以下简称根目录)下生成一个 composer.json 的配置文件。

然后我们在根目录下新建一个 app 文件夹,作为框架的主要入口,同时在 composer.json 中添加 autoload 的配置项,完成后的 composer.json 如下:

{
  "name": "syfxlin/xkphp",
  "description": "一个轻量的 PHP 框架",
  "type": "project",
  "license": "Apache 2.0",
  "authors": [
    {
      "name": "syfxlin",
      "email": "syfxlin@gmail.com"
    }
  ],
  "autoload": {
    "psr-4": {
      "App\\": "app/"
    }
  },
  "require": {}
}
{
  "name": "syfxlin/xkphp",
  "description": "一个轻量的 PHP 框架",
  "type": "project",
  "license": "Apache 2.0",
  "authors": [
    {
      "name": "syfxlin",
      "email": "syfxlin@gmail.com"
    }
  ],
  "autoload": {
    "psr-4": {
      "App\\": "app/"
    }
  },
  "require": {}
}

其中 psr-4 指的是按 PSR-4 标准加载的命名空间,key 是命名空间,value 是路径,此时在 app 下的所有类如果按 PSR-4 标准进行编写,那么 Composer 就会自动加载了。

然后执行以下代码初始化 Composer 的 autoload 文件:

composer install
composer install

不过此时还不算完成,我们还需要写一个入口文件,作为网站的入口,这里我放到根目录下的 public 文件夹下,这样外部就无法直接访问根目录了。在 public 文件夹下建立 index.php 文件,内容如下:

<?php
// 定义根目录
define('BASE_PATH', dirname(__DIR__) . '/');
// 引入 Composer 的 autoload
require_once __DIR__ . '/../vendor/autoload.php';
<?php
// 定义根目录
define('BASE_PATH', dirname(__DIR__) . '/');
// 引入 Composer 的 autoload
require_once __DIR__ . '/../vendor/autoload.php';

此时 Composer 已经可以正常工作了,我们写一个类来测试下,在 app 目录下新建一个 Test 类:

<?php

namespace App;

class Test
{
    /**
     * @var string
     */
    public $name = "Test";
}
<?php

namespace App;

class Test
{
    /**
     * @var string
     */
    public $name = "Test";
}

然后在 index.php 下添加 echo (new Test())->name,然后运行测试下:

结语

今天就简单介绍了下 Composer 和 PSR,下一篇文章不出意外就是 IoC 容器了,您可以先前往我之前的文章了解一下:

从零实现一个 PHP 微框架 - PSR & Composer

https://blog.ixk.me/post/implement-a-php-microframework-from-zero-2
  • 许可协议

    BY-NC-SA

  • 本文作者

    Otstar Lin

  • 发布于

    2020/05/09

转载或引用本文时请遵守许可协议,注明出处、不得用于商业用途!

从零实现一个 PHP 微框架 - IoC 容器从零实现一个 PHP 微框架 - 前言