search
HomeBackend DevelopmentPHP TutorialCreate PSR-4 Php package
Create PSR-4 Php packageOct 23, 2020 pm 05:28 PM
phppsr-4

Create PSR-4 Php package

【相关学习推荐:php图文教程

本文是帮助初学者搭建基础的 php composer 包, 本项目源码地址

  • github
  • packagist

目录结构和初建准备

首先创建一个目录来存放所有文件, 这里我 命名为 util-demo , 目录中需要包含两个目录 src/, tests/, 所有的代码需要放置到 src/ 目录, 所有的测试文件需要放置到 tests/ 目录

初始化文件夹, 并使用 git 初始化项目, 便于进行版本管理

$ mkdir util-demo
$ cd util-demo
$ git init复制代码

初始化 composer

这里假定你已经安装了 composer, 如果没有安装, 请到 getcomposer.org/download/ 进行安装

初始化并输入包名, 这里默认使用 duoli/util-demo 包名

$ composer init

Welcome to the Composer config generator  
                                            
This command will guide you through creating your composer.json config.

Package name (<vendor>/<name>) [duoli/util-demo]: 
复制代码</name></vendor>

输入描述

Description []: first util package demo复制代码

输入作者名称, n 跳过

Author [duoli <zhaody901>, n to skip]: 
复制代码</zhaody901>

设定包的稳定版本, 默认是 stable, 详细查看 minimum-stability (root-only)

Minimum Stability []: 
复制代码

安装类型 : Package Type, 默认是 library

Package Type (e.g. library, project, metapackage, composer-plugin) []: 
复制代码

License, 协议, 关于协议部分, 你可以选择自己需要的协议, 阮老师这里有一个阅读指南, 可以进行参考 如何选择开源许可证?, 对于协议部分的写法可以参考 许可协议 license 这里

License []: 
复制代码

require

设定三方依赖, 表明当前项目/包是否有依赖于其他包进行开发, 这里选择 no,

Define your dependencies.

# 生产依赖
Would you like to define your dependencies (require) interactively [yes]? 
复制代码

require-dev

开发依赖, 这里我们加入 phpunit 作为单元测试依赖

Would you like to define your dev dependencies (require-dev) interactively [yes]?

Search for a package: phpunit

Found 15 packages matching phpunit

   [0] phpunit/phpunit 
   ...
   [14] brianium/paratest 

Enter package # to add, or the complete package name if it is not listed: 0
Enter the version constraint to require (or leave blank to use the latest version): 
Using version ^8.5 for phpunit/phpunit
Search for a package: 
复制代码

当不需要额外增加包的时候, 直接回车, 确认安装包依赖, 初始化完成

{
    "name": "duoli/util-demo",
    "description" : "first util package demo",
    "require-dev": {
        "phpunit/phpunit": "^8.5"
    },
    "license": "MIT",
    "authors": [
        {
            "name": "duoli",
            "email": "zhaody901@126.com"
        }
    ],
    "require": {}
}

Do you confirm generation [yes]? 

Would you like to install dependencies now [yes]? yes
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 29 installs, 0 updates, 0 removals
  - Installing sebastian/version (2.0.1): Downloading (100%)         
  ......     
  - Installing phpunit/phpunit (8.5.8): Downloading (100%)         
sebastian/global-state suggests installing ext-uopz (*)
phpunit/phpunit suggests installing phpunit/php-invoker (^2.0.0)
Package phpunit/php-token-stream is abandoned, you should avoid using it. No replacement was suggested.
Writing lock file
Generating autoload files
5 packages you are using are looking for funding.
Use the `composer fund` command to find out more!复制代码

上边初始化完成之后, 我们文件目录应该如下所示

.
├── composer.json
├── composer.lock
└── vendor复制代码

作为包管理来讲, 我们需要忽略 composer.lockvendor 文件夹, 因为在项目中使用此包的时候会进行全局的安装, 不提交是为了不产生冗余代码.

我们加入 .gitignore 文件, 加入这两个文件夹的忽略, 另外由于要生成 phpunit 测试文件, 我们还需要加入 .phpunit.* , 我这里还额外加入了 IDE 的忽略

.gitignore

# ide
.idea

# project
composer.lock
vendor/

# phpunit
.phpunit.*复制代码

文件自动加载 autoload

autoload

这里是上边初始化没有提及到的, autoload 指定了包的加载方式, Composer 可以自动加载包内文件, 但是你需要指定你的文件的加载方式, 这里我们使用的是 psr-4 标准, 详细的规范可以阅读 PSR-4 自动加载规范

这里需要在 composer.json 中追加

   ...    "autoload": {        "psr-4": {            "Duoli\\UtilDemo\\": "src",            "Duoli\\UtilDemoTests\\": "tests"
        }
    }
   ... 
复制代码

因为这个加载是后续添加的, 想要识别需要我们手动运行下 composer dumpautoload, 这样才可以识别我们添加的命名空间映射

另这里我额外约定了一个测试的命名空间, 方便对测试文件进行命名空间的目录识别

travis 测试集成

如果打算在GitHub上托管包,一个不错优点是集成Travis CI,这是一个持续集成应用程序,它会自动运行单元测试文件. 当接受 pr 时,会非常有用,因为你可以快速查看是否所有的测试都通过验证。

要与 Travis 集成,添加一个名为 .travis.yml 的文件,并复制以下内容

language: php

php:
    – 7.0
    – hhvm

before_script:
    – composer self-update
    – composer install –prefer-source –no-interaction –dev

script: phpunit复制代码

在这里,不会深入讨论使用 Travis 的问题,但这应该是一个很好的开始,你可以自己来进行研究如何使用它.

编写代码

现在可以编写代码了, 打开 src 目录创建 File.php 文件, 复制如下代码

class File{    public function extension($filename)    {        return pathinfo($filename, PATHINFO_EXTENSION);
    }

}复制代码

如果你曾经查看过旧的 PHP 包源码,可能会发现一个 Duoli/UtilDemo 目录。PSR-4 不再使用嵌套的目录结构,而是允许直接在 src 目录下编写类

编写单元测试

现在我们已经编写了包源码,可以开始编写一些测试了。PHPUnit 需要一个名为 phpunit.xml 的文件来定义一些设置。在根目录中创建一个新的phpunit.xml文件,并复制以下代码:

<phpunit>
    <testsuites>
        <testsuite>
            <directory>./tests/</directory>
        </testsuite>
    </testsuites></phpunit>复制代码

如果不熟悉这个文件中意思,不用担心,你无需关注设置了哪些内容(当前来讲), 这个文件只是定义一些设置和文件应该如何自动加载的约定.

接下来,在 tests 目录下,创建一个名为 StrTest.php的文件,并复制以下代码:

<?php  namespace Duoli\UtilDemoTests;

use Duoli\UtilDemo\File;
use PHPUnit\Framework\TestCase;

class FileTest extends TestCase
{

    public function testExtension()
    {
        $extension = File::extension(&#39;readme.md&#39;);
        $this->assertEquals('md', $extension);
    }

}复制代码

打开命令行并运行:

$ ./vendor/bin/phpunit复制代码

PHPUnit 会自动运行测试,并给出一个绿色的 OK (1 test, 1 assertion) 输出。

在编写测试文件时,需要确保测试类继承了 PHPUnit\Framework\TestCase

文档

最后要做的是创建一个 Readme.md 的文档。如果打算在 GitHub上托管代码,这个文件会在代码页面显示出来,目的是描述包以及包如何工作.

还应该在源代码中包含一个许可证。默认情况下,你发布的任何东西都是你的版权所有,如果你想让其他人使用你的代码,你需要给它一个许可。一个好的选择是 MIT 许可

发布到 github 和 Packagist

现在已经完成了你的包,你可以将它推到 GitHub 和 Packagist。

GitHub 是一个托管的 git 存储库服务,它使得在软件协作变得非常容易。

Packagist 是查找和使用 PHP 包的服务商

要将代码推送到 GitHub,创建一个新的存储库, 然后设定 git 的远端, 将代码推上去即可, 命令是

$ git remote add origin git@github.com:username/demo.git  
$ git push -u origin master  
复制代码

在 Github 上集成 Packagist 和 Travis, 需要找到设置, 并且在  Webhooks & Services 部分找到这两个服务, 集成这两个服务需要授权 github 账户并且设置一些简单的步骤.

概括

如果以前从未开发过已发布的 php 包,那么需要考虑很多问题。然而,一旦你操作过不止一次就不至于这么复杂了.

PHP 的包结构非常简单,而 PSR-4 使其更加简单。一旦了解了该结构的每一部分是用于做什么,其他人阅读 PHP包就会容易很多.

参考文章

  • How to create a PSR-4 PHP package

相关学习推荐:php编程(视频)

The above is the detailed content of Create PSR-4 Php package. For more information, please follow other related articles on the PHP Chinese website!

Statement
This article is reproduced at:juejin. If there is any infringement, please contact admin@php.cn delete
php怎么把负数转为正整数php怎么把负数转为正整数Apr 19, 2022 pm 08:59 PM

php把负数转为正整数的方法:1、使用abs()函数将负数转为正数,使用intval()函数对正数取整,转为正整数,语法“intval(abs($number))”;2、利用“~”位运算符将负数取反加一,语法“~$number + 1”。

php怎么实现几秒后执行一个函数php怎么实现几秒后执行一个函数Apr 24, 2022 pm 01:12 PM

实现方法:1、使用“sleep(延迟秒数)”语句,可延迟执行函数若干秒;2、使用“time_nanosleep(延迟秒数,延迟纳秒数)”语句,可延迟执行函数若干秒和纳秒;3、使用“time_sleep_until(time()+7)”语句。

php字符串有没有下标php字符串有没有下标Apr 24, 2022 am 11:49 AM

php字符串有下标。在PHP中,下标不仅可以应用于数组和对象,还可应用于字符串,利用字符串的下标和中括号“[]”可以访问指定索引位置的字符,并对该字符进行读写,语法“字符串名[下标值]”;字符串的下标值(索引值)只能是整数类型,起始值为0。

php怎么除以100保留两位小数php怎么除以100保留两位小数Apr 22, 2022 pm 06:23 PM

php除以100保留两位小数的方法:1、利用“/”运算符进行除法运算,语法“数值 / 100”;2、使用“number_format(除法结果, 2)”或“sprintf("%.2f",除法结果)”语句进行四舍五入的处理值,并保留两位小数。

php怎么读取字符串后几个字符php怎么读取字符串后几个字符Apr 22, 2022 pm 08:31 PM

在php中,可以使用substr()函数来读取字符串后几个字符,只需要将该函数的第二个参数设置为负值,第三个参数省略即可;语法为“substr(字符串,-n)”,表示读取从字符串结尾处向前数第n个字符开始,直到字符串结尾的全部字符。

php怎么根据年月日判断是一年的第几天php怎么根据年月日判断是一年的第几天Apr 22, 2022 pm 05:02 PM

判断方法:1、使用“strtotime("年-月-日")”语句将给定的年月日转换为时间戳格式;2、用“date("z",时间戳)+1”语句计算指定时间戳是一年的第几天。date()返回的天数是从0开始计算的,因此真实天数需要在此基础上加1。

php怎么替换nbsp空格符php怎么替换nbsp空格符Apr 24, 2022 pm 02:55 PM

方法:1、用“str_replace("&nbsp;","其他字符",$str)”语句,可将nbsp符替换为其他字符;2、用“preg_replace("/(\s|\&nbsp\;||\xc2\xa0)/","其他字符",$str)”语句。

php怎么查找字符串是第几位php怎么查找字符串是第几位Apr 22, 2022 pm 06:48 PM

查找方法:1、用strpos(),语法“strpos("字符串值","查找子串")+1”;2、用stripos(),语法“strpos("字符串值","查找子串")+1”。因为字符串是从0开始计数的,因此两个函数获取的位置需要进行加1处理。

See all articles

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

AI Hentai Generator

AI Hentai Generator

Generate AI Hentai for free.

Hot Article

R.E.P.O. Energy Crystals Explained and What They Do (Yellow Crystal)
3 weeks agoBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Best Graphic Settings
3 weeks agoBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. How to Fix Audio if You Can't Hear Anyone
3 weeks agoBy尊渡假赌尊渡假赌尊渡假赌

Hot Tools

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser is a secure browser environment for taking online exams securely. This software turns any computer into a secure workstation. It controls access to any utility and prevents students from using unauthorized resources.

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

Integrate Eclipse with SAP NetWeaver application server.

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

DVWA

DVWA

Damn Vulnerable Web App (DVWA) is a PHP/MySQL web application that is very vulnerable. Its main goals are to be an aid for security professionals to test their skills and tools in a legal environment, to help web developers better understand the process of securing web applications, and to help teachers/students teach/learn in a classroom environment Web application security. The goal of DVWA is to practice some of the most common web vulnerabilities through a simple and straightforward interface, with varying degrees of difficulty. Please note that this software

Dreamweaver Mac version

Dreamweaver Mac version

Visual web development tools