12-Composer的配置与使用详解

news2024/9/23 5:29:02

1、自定义类与非类的自动加载与测试


# composer

> php 包管理工具 ,类似npm

1.自己写的类,函数,接口,常量等全局成员,通过自动加载来实现按需加载
2.自己写的代码,有哪些依赖,用到了哪些外部成员,我自己知道,可以自己管理
3.如果第三方(别人写的),由包管理工具,实现自动加载以及包之间的依赖的处理
4.php中用的是`composer`来实现这个功能,类似于Apple Store,手机应用的商店

## 1.自动加载器

1. `composer init`:交互式创建配置文件 `composer,json`
2. 创建成功后,可以在`vendor/`下面有一个`autoload.php`的自动加载器

## 2.自动加载我自己写的类
> 我自己写的类,依赖关系我自己处理,能不能加载?可以,就用composer就可以

> 这个类文件叫composer.json
```json
{ : {
        "classmap":[
            "inc/",
            "MyClass.php"
        ]
    }
}
```

每一步写完要执行`composer dumpautoload`使之注册并生效
## 3.自动加载我自己写的其它文件
> 注意:文件中的成员必须是全局的才可以自动加载和使用
> 哪些是全局代码(要用空间访问的):类,接口,trait,函数,常量(变量不是,变量有作用域的)
> 配置文件(例如连接数据库的文件):`config/connect.php`
> 公共函数库:`lib/helper.php`

## 4.PSR-4 自动加载功能

### psr(php推荐标准)-4

1.专用于**类**的自动加载
2.`类空间`与`类路径`存在映射关系
3.`类名`与`类文件`同名
4.支持`空间分级`(顶层空间/子空间/自动查询)管理

> 命名空间与类路径名称不一定相同
> 类泛指类:class/interface/trait
> 注意:对象的模板是类,类的模板是接口

## 5.加载第三方的包(只有这个是必须用composer)
> 第三方包(也属于全局成员)的依赖关系,由 composer 进行处理

1.composer.json:`"require":{...}`,`composer install`
2.新建终端输入`composer require 包名`,会自动更新 composer.json
3.都会自动创建`composer.lock`锁定当前版本
4.`composer create-project topthink/think blog`:通过包来创建完整项目

## 6.总结

1.自动加载
2.依赖管理

2、composer的使用

 2-1 首先进入当前命名空间,然后使用composer指令

 如此可证明composer安装成功

2-2 使用 composer selfupdate可以对composer版本进行升级 

 

2-3 升级后通过 composer -v  查看composer版本

2-4 对于composer来说,有个非常重要的文件,就是它的配置文件 (composer.json)

该文件包含了项目的依赖和其它的一些元数据

3、composer.json 

如果手动创建了composer.json文件,则使用composer install,代表安装在composer.json中声明的第三方类库,且手动创建的composer.json必须包含有效的json格式{}

或者,直接使用命令composer init,初始化一个配置文件。 

我自己写的类或其它文件:"autoload":{

        "classmap":[],

        "files":[],

        "psr-4":{}

第三方的类:"require":{}

classmap:

把类的映射关系声明到classmap中,当我加载或调用一个我当前还没有加载的类的时候,我用classmap告诉项目,从哪里找这个类。写完以后还需使用指令composer dumpautoload 使对应的autoload_classmap.php完成注册(在array里) 

"classmap":[
    "inc/",
    "MyClass.php"
],

在class可以直接引用文件名,这样相当于文件名下的所有类都被加载进来。

也可以只引用某个文件。 

files:

把非类文件的映射关系声明到files中,当我加载或调用一个我当前还没有加载的非类文件的时候,我用files告诉项目,从哪里找这个文件。写完以后还需使用指令composer dumpautoload 使对应的autoload_files.php完成注册(在array里) 

"files":[
    "config/connect.php",
    "lib/helper.php"
],

4、autoload.php 

系统自动给我们写好的配置文件(相当于自己写的自动加载器)

5、 database.php

连接数据库的参数配置

<?php

//数据库连接参数
return [
    'dsn'=>'mysql:dbname=phpedu',
    'username'=>'root',
    'password'=>'root'
];

6、connect.php

连接文件,用于实现数据库的连接 

<?php

namespace _0823;

use PDO;

//连接数据库

class Db{
    private $db = null;
    public function __construct($dsn,$username,$password)
    {
        $this->db = new PDO($dsn,$username,$password);
    }
    //测试方法
    public function select($sql){
        return $this->db->query($sql)->fetchAll(PDO::FETCH_ASSOC);
    }
}

7、 使用Db类

<?php

namespace _0823;

//验证自己写的函数或其它文件

//加载composer的自动加载器
require 'vendor/autoload.php';

//$dsn,$username,$password声明在database.php文件
//可以用extract这样写,但是没必要
// extract([
//     'dsn' => 'mysql:dbname=phpedu',
//     'username' => 'root',
//     'password' => 'root'
// ]);
extract(require 'config/database.php');
$db = new Db($dsn, $username, $password);

$users = $db->select('select * from user');
foreach($users as $user){
    printf('<pre>%s</pre>',print_r($user,true));
}

var_dump($db);

echo sum(3,4,5,6);

8、任意数量数据求和

<?php

function sum(...$items){
    //也可以用 array_reduce()
    return array_sum($items);
}

9、psr-4

php推荐标准,只能用于类的自动加载,并且要求类空间与类路径存在映射关系, 这一点和手写的自动加载器很像(如果一个类,它的命名空间和路径存在映射关系就可以写一个自动加载器,我们只需要解析一下类的命名空间解析出来里面的内容作为路径,这样就可以把这个类给加载过来了)。

并且类名一定要和类文件名相同。

<?php

//空间名与路径名可以不同,只要正确的映射就可以
namespace phpcn;
//类名与类文件名要一致
class Index
{
    public static function show()
    {
        //魔术常量__METHOD__返回一下当前方法名
        return '方法名:' . __METHOD__;
    }
}

因为反斜线是转义符,所以必须敲两次 

"psr-4": {
    "phpcn\\":"admin/"
}

 

 在命令行使用composer dumpautoload完成对psr4的注册

10、psr-4的(命名)空间分级管理

 在admin文件夹下,新建一个文件夹controller,在controller下再新建文件login.php

<?php

//空间名与路径名可以不同,只要正确的映射就可以
namespace phpcn\controller;
//类名与类文件名要一致
class Login
{
    public static function show()
    {
        //魔术常量__METHOD__返回一下当前方法名
        return '方法名:' . __METHOD__;
    }
}

 然后需要在配置文件中对phpcn\controller空间和Login类的映射进行注册,但是,由于之前我们已经把phpcn作为一个顶层的命名空间路径给注册到admin下面了,那么在admin文件夹下面所有的类文件以及

10、 第三方包与依赖管理

自己写的类或者其它文件可以自己写一个自动加载器而不一定非要用到composer,但是由于第三方包都会遵循composer标准,所以必须要用composer自动加载器,而且很容易进行一些依赖管理。

 

 第一种方法是在composer.json里面的require对象里写入我们要引入的第三方包。

    "require": {
        "gregwar/captcha":"1.1.*",
    }

*代表最新版本 

 最后在终端使用命令composer install把这个包安装到当前项目

 

 第二种方法是直接在命令终端输入指令直接安装。

这两种方法都会自动创建composer.lock锁定当前版本 

 11、验证并使用第三方包

inline指在页面中怎么用,只需要实例化该类然后在需要的位置引用就行了

<?php
require_once 'vendor/autoload.php';

use Gregwar\Captcha\CaptchaBuilder;

$captcha = new CaptchaBuilder();
$captcha->build();

?>
<!DOCTYPE html>
<body>
    <html>
        <meta charset="utf-8" />
    </html>
    <body>
        <h1>Inline Captcha</h1>

        <img src="<?php echo $captcha->inline(); ?>"/><br/>
        Phrase: <?php echo $captcha->getPhrase(); ?>
        
    </body>
</body>

 遇到了一个bug:从 float  到 int 的隐式转换会丢失精度

 

需将$x和$y强制转成int型即可 

  

  12、使用composer基于包创建一个项目

在终端使用命令composer create-project topthink/think blog创建项目,最后的blog是给这个项目文件夹的命名,如果没有blog这个参数,那么这个文件名则为think(即包名)。注意,这里用的不是require指令,而是create-project指令

 

 打开这个项目blog可以发现,当前这个项目是一个完整的框架项目,这里面它有自己的composer.json(配置器),有自己的一个包目录(vendor),框架的源码在vender里面有一个topthink

 13、medoo(加速开发的轻量级PHP数据库框架)

在终端使用composer require catfan/medoo指令进行安装

 

<?php

namespace _0823;

use Medoo\Medoo;
use PDO;

require 'vendor/autoload.php';

$opt = [
	'type' => 'mysql',
	'host' => 'localhost',
	'database' => 'phpedu',
	'username' => 'root',
	'password' => 'root',
];

$db =  new Medoo($opt);
//查询
// $staffs = $db->select('staff','*');
// print_r($staffs);

//查询(原生PDO操作)
// '?'处不能直接传3,因为会当字符串处理,需要做一个绑定
$stmt = $db->pdo->prepare('select * from staff limit ?');
$stmt->bindValue(1,3,PDO::PARAM_INT);
$stmt->execute();
printf("<pre>%s</pre>",print_r($stmt->fetchAll(PDO::FETCH_ASSOC),true));

上述运行结果: 

 

Array
(
    [0] => Array
        (
            [id] => 1
            [name] => admin
            [sex] => 1
            [email] => admin@php.cn
        )

    [1] => Array
        (
            [id] => 2
            [name] => 杨过
            [sex] => 1
            [email] => yangguo@qq.com
        )

    [2] => Array
        (
            [id] => 3
            [name] => 小龙女
            [sex] => 0
            [email] => xiaolongnv@qq.com
        )

)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/357150.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL数据库调优————GROUP BY及DISTINCT优化

GROUP BY 三种处理GROUP BY的方式 松散索引扫描&#xff08;Loose Index Scan&#xff09;紧凑索引扫描&#xff08;Tight Index Scan&#xff09;临时表&#xff08;Temporary table&#xff09; 三种方式的性能一次递减 松散索引扫描 无需扫描满足条件的所有索引键即可返…

基于SSM,Spring, BootStrap 毕业设计管理系统的设计与实现

目录 一.前言介绍 二、主要技术 2.1 SSM框架介绍 2.2 MYSQL数据库 2.3 持久层框架MyBatis 2.4 前端框架BootStrap 三. 系统设计 3.1 系统架构设计 3.2 系统功能模块 3.2.1 学生模块 3.2.2 教师模块 3.2.3 管理员模块 四、数据库设计 4.1 数据分析 4.2 概念设计 …

SpringBoot搭建SpringMVC项目

前言据我的了解&#xff0c;现在不管是大公司或是小公司&#xff0c;如果使用java开发一个web项目&#xff0c;大部分都会选择使用SpringBoot&#xff0c;关于Springboot的好处&#xff0c;就不在这里过多赘述&#xff0c;总之Springboot有一套完整的生态&#xff0c;从项目构建…

Java【七大排序】算法详细图解,一篇文章吃透

文章目录一、排序相关概念二、七大排序1&#xff0c;直接插入排序2&#xff0c;希尔排序3&#xff0c;选择排序4&#xff0c;堆排序5&#xff0c;冒泡排序5.1冒泡排序的优化6&#xff0c;快速排序6.1 快速排序的优化7&#xff0c;归并排序三、排序算法总体分析对比总结提示&…

多层感知机

多层感知机理论部分 本文系统的讲解多层感知机的pytorch复现&#xff0c;以及详细的代码解释。 部分文字和代码来自《动手学深度学习》&#xff01;&#xff01; 目录多层感知机理论部分隐藏层多层感知机数学逻辑激活函数1. ReLU函数2. sigmoid函数3. tanh函数多层感知机的从零…

Allegro如何快速把推挤的走线变平滑操作指导

Allegro如何快速把推挤的走线变平滑操作指导 Allegro有个非常强大的功能,推挤命令,可以快速的让走线以不报DRC的形式避让目标 推挤后的效果如下图 但是走线不够平滑,如果每一段都去再推一下比较费时间,下面介绍allegro本身自带的优化类似走线的功能 具体操作如下 点击Rout…

sklearn学习-朴素贝叶斯

文章目录一、概述1、真正的概率分类器2、sklearn中的朴素贝叶斯二、不同分布下的贝叶斯1、高斯朴素贝叶斯GaussianNB2、探索贝叶斯&#xff1a;高斯朴素贝叶斯擅长的数据集3、探索贝叶斯&#xff1a;高斯朴素贝叶斯的拟合效果与运算速度总结一、概述 1、真正的概率分类器 算法…

计算机组成与体系结构

目录 1.计算机结构 2.寻址方式 3.CISC与RISC 4.流水线 1.计算机结构 运算器 算术逻辑单元ALU&#xff1a;数据的算术运算和逻辑运算累加寄存器AC&#xff1a;通用寄存器&#xff0c;为ALU提供一个工作区&#xff0c;用在暂存数据数据缓存寄存器DR&#xff1a;写内存中&…

Linux LVM逻辑卷

目录 LVM逻辑卷 什么是LVM LVM常用术语 管理逻辑卷相关命令 创建LVM逻辑卷 LVM扩容 LVM缩小 LVM快照卷 删除LVM LVM逻辑卷 什么是LVM LVM&#xff08;Logical Volume Manager&#xff09;逻辑卷管理器&#xff0c;是一种硬盘的虚拟化技术&#xff0c;能够实现用户对硬…

基于微信小程序的校园顺路代送小程序

文末联系获取源码 开发语言&#xff1a;Java 框架&#xff1a;ssm JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7/8.0 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.3.9 浏览器…

还真不错,今天 Chatgpt 教会我如何开发一款小工具开发(Python 代码实现)

上次使用 Chatgpt 写爬虫&#xff0c;虽然写出来的代码很多需要修改后才能运行&#xff0c;但Chatgpt提供的思路和框架都是没问题。 这次让 Chatgpt 写一写GUI程序&#xff0c;也就是你常看到的桌面图形程序。 由于第一次测试&#xff0c;就来个简单点的&#xff0c;用Python…

Linux命令之grep

Linux grep是一个非常强大的文本搜索工具。按照给定的正则表达式对目标文本进行匹配检查&#xff0c;打印匹配到的行。grep命令可以跟其他命令一起使用&#xff0c;对其他命令的输出进行匹配。 grep语法如下&#xff1a; grep [options] [pattern] content 文本检索 grep可以对…

51单片机蜂鸣器的使用

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录前言一、有源蜂鸣器和无源蜂鸣器的区别二、代码编写总结前言 本文旨在介绍如何使用51单片机驱动蜂鸣器。 一、有源蜂鸣器和无源蜂鸣器的区别 有源蜂鸣器是一种电子…

easyExcel 写复杂表头

写模板 模板图片&#xff1a; 实体类&#xff08;这里没有用Data 是因为Lombok和easyExcal的版本冲突&#xff0c;在导入读取的时候获取不到值&#xff09; package cn.iocoder.yudao.module.project.controller.admin.goods.vo;import com.alibaba.excel.annotation.ExcelI…

编译安装MySQL

MySQL 5.7主要特性 随机root 密码&#xff1a;MySQL 5.7 数据库初始化完成后&#xff0c;会自动生成一个 rootlocalhost 用户&#xff0c;root 用户的密码不为空&#xff0c;而是随机产生一个密码。原生支持&#xff1a;Systemd 更好的性能&#xff1a;对于多核CPU、固态硬盘、…

【蓝桥集训】第四天——双指针

作者&#xff1a;指针不指南吗 专栏&#xff1a;Acwing 蓝桥集训每日一题 &#x1f43e;或许会很慢&#xff0c;但是不可以停下&#x1f43e; 文章目录1.字符串删减2.最长连续不重复子序列3.数组元素的目标和1.字符串删减 给定一个由 n 个小写字母构成的字符串。 现在&#xff…

GCC 同名符号冲突解决办法

一、绪论 作为 C/C 的开发者&#xff0c;大多数都会清楚课本上动态库以及静态库的优缺点&#xff0c;在教科书上谈及到动态库的一个优点是可以节约磁盘和内存的空间&#xff0c;多个可执行程序通过动态库加载的方式共用一段代码段 &#xff1b;而时至今日&#xff0c;再看看上…

数据库浅谈之常见树结构

数据库浅谈之常见树结构 HELLO&#xff0c;各位博友好&#xff0c;我是阿呆 &#x1f648;&#x1f648;&#x1f648; 这里是数据库浅谈系列&#xff0c;收录在专栏 DATABASE 中 &#x1f61c;&#x1f61c;&#x1f61c; 本系列阿呆将记录一些数据库领域相关的知识 &#…

metasploit穷举模块

目录 工具介绍 常用模块 参数介绍 工具使用 工具介绍 Metasploit框架(Metasploit Framework, MSF)是一个开源工具&#xff0c; 旨在方便渗透测试&#xff0c;它是由Ruby程序语言编写的模板化框架&#xff0c;具有很好的扩展性&#xff0c;便于渗透测试人员开发、使用定制的…

浅析C++指针与引用,栈传递的关系

目录 前言 C 堆指针 栈指针 常量指针 指针常量 引用 常量引用 总结 前言 目前做了很多项目&#xff0c;接触到各种语言&#xff0c;基本上用什么学什么&#xff0c;语言的边际就会很模糊&#xff0c;实际上语言的设计大同小异&#xff0c;只是语言具备各自的特性区别。…