当前位置: 首页 > news >正文

12-Composer的配置与使用详解

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


# composer> php 包管理工具 ,类似npm1.自己写的类,函数,接口,常量等全局成员,通过自动加载来实现按需加载
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推荐标准)-41.专用于**类**的自动加载
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

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

<?phpnamespace _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类

<?phpnamespace _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、任意数量数据求和

<?phpfunction 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指令进行安装

 

<?phpnamespace _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))

相关文章:

12-Composer的配置与使用详解

1、自定义类与非类的自动加载与测试 # composer> php 包管理工具 &#xff0c;类似npm1.自己写的类&#xff0c;函数&#xff0c;接口&#xff0c;常量等全局成员&#xff0c;通过自动加载来实现按需加载 2.自己写的代码&#xff0c;有哪些依赖&#xff0c;用到了哪些外部成…...

RK3566开启wifi自适应

系统:linux(buildroot) 一、修改Makefile,使能RTW_ADAPTIVITY 文件路径:..\x3566_linux_v1.2.0\kernel\drivers\net\wireless\rockchip_wlan\rtl8821cs\Makefile 第74行&#xff1a; CONFIG_RTW_ADAPTIVITY_EN disable 改为&#xff1a; CONFIG_RTW_ADAPTIVITY_EN enab…...

shell编程之变量定义

typora-copy-images-to: pictures typora-root-url: …\pictures 文章目录typora-copy-images-to: pictures typora-root-url: ..\..\pictures一、SHELL介绍㈠ 什么是shell脚本&#xff1f;㈡ 什么时候用到脚本?㈢ shell脚本能干啥?㈣ 如何学习shell脚本&#xff1f;㈤ 学习s…...

Spring Cloud Alibaba 微服务简介

微服务简介 1 什么是微服务 2014年&#xff0c;Martin Fowler&#xff08;马丁福勒 &#xff09; 提出了微服务的概念&#xff0c;定义了微服务是由以单一应用程序构成的小服务&#xff0c;自己拥有自己的进程与轻量化处理&#xff0c;服务依业务功能设计&#xff0c;以全自动…...

【调试】GDB使用总结

启动 在shell下敲gdb命令即可启动gdb&#xff0c;启动后会显示下述信息&#xff0c;出现gdb提示符。 ➜ example gdb GNU gdb (Ubuntu 8.1.1-0ubuntu1) 8.1.1 Copyright (C) 2018 Free Software Foundation, Inc. License GPLv3: GNU GPL v…...

基于Spring、Spring MVC、MyBatis的招聘管理系统

文章目录项目介绍主要功能截图&#xff1a;首页账户管理招聘建议部分代码展示设计总结项目获取方式&#x1f345; 作者主页&#xff1a;Java韩立 &#x1f345; 简介&#xff1a;Java领域优质创作者&#x1f3c6;、 简历模板、学习资料、面试题库【关注我&#xff0c;都给你】 …...

软件测试基础

文章目录前言一、软件测试入门1.什么是软件测试&#xff1f;2.测试和开发的区别3.调试和测试的区别4.一些常问面试题5.测试人员需要具备的素质二、软件测试基础1.需求2.测试用例3.Bug4.软件的生命周期5.开发模型三、Bug1.如何创建bug2.Bug的级别3.Bug的生命周期4.跟开发产生争执…...

【算法基础】链表

一、单链表例题&#xff1a;实现一个单链表&#xff0c;链表初始为空&#xff0c;支持三种操作&#xff1a;向链表头插入一个数&#xff1b;删除第 k个插入的数后面的数&#xff1b;在第 k&#xfffd; 个插入的数后插入一个数。现在要对该链表进行 M次操作&#xff0c;进行完所…...

[AUTOSAR][Fls模块] Flash Driver Module

Flash Driver Module--jianqiang.xue一、 简介二、 措施方式一&#xff1a;将FLASH操作程序作为Bootloader组件的一部分固化在存储器中方式二&#xff1a;通过通讯口将该部分代码从上位机下载到指定的RAM方式三&#xff1a;将Flash功能函数作为数据运行(推荐&#xff01;&#…...

如何正确选择好用的投票平台微信公众平台投票链接链接投票平台

“年度人物楷模”网络评选投票_免费链接投票_作品投票通道_扫码投票怎样进行现在来说&#xff0c;公司、企业、学校更多的想借助短视频推广自己。通过微信投票小程序&#xff0c;网友们就可以通过手机拍视频上传视频参加活动&#xff0c;而短视频微信投票评选活动既可以给用户发…...

gocd部署应用

产品需要在多个环境部署测试&#xff0c;为了提高部署测试效率&#xff0c;故计划使用CD工具&#xff0c;jenkins确实足够强大&#xff0c;但是使用部署功能是需要安装插件的&#xff0c;再说自己本身只用部署功能&#xff0c;故决定找一个小巧的CD工具&#xff0c;经过一番查找…...

P2P视频聊天技术分析

整个P2P视频过程需要知道双方的媒体类型、流和候选者&#xff0c;所以这里就会用到一下技术&#xff1a; ​ 信令服务器socket.io ​ 状态机 ​ ICE服务器 ​ WebRTC框架 ​ 媒体协商 信令服务器Socket.io 信令服务器说白了作用就是发消息的中转站&#xff0c;A把msg发到…...

MyBatis 的一级、二级缓存机制

目录标题缓存什么是缓存为什么使用缓存什么样的数据能使用缓存&#xff0c;什么样的数据不能使用适用于缓存不适用于缓存MyBatis 一级缓存、二级缓存关系1. 一级缓存1.1 什么是一级缓存mybatis1.2 一级缓存配置1.3 什么情况下会命中一级缓存mybatis清除一级缓存的几种方法1.4 内…...

剑指 Offer 65. 不用加减乘除做加法

摘要 剑指 Offer 65. 不用加减乘除做加法 一、位运算 有符号整数通常用补码来表示和存储&#xff0c;补码具有如下特征&#xff1a; 正整数的补码与原码相同&#xff1b;负整数的补码为其原码除符号位外的所有位取反后加 11。可以将减法运算转化为补码的加法运算来实现。符…...

5年软件测试年薪30w+,我的坎坷之路谁又知道

在深圳做了五年软件测试工作&#xff0c;从之前的一脸懵的点点点&#xff0c;到现在会自动化测试&#xff0c;说一点点非计算机专业人员从事软件测试的心得体会&#xff0c;仅供参考交流。 大部分测试在公司没啥地位&#xff0c;当然如果你懂技术就还行&#xff0c;单纯点点点…...

【Opencv--自适应图像二值化】cv2.adaptiveThreshold()

【Opencv–adaptiveThreshold】自适应阈值图像二值化 文章目录【Opencv--adaptiveThreshold】自适应阈值图像二值化1. 介绍2. adaptiveThreshold函数2.1 函数调用2.2 补充说明3. 代码示例4. 效果4.1 原图&#xff08;ori.img&#xff09;4.2 处理后5. 参考1. 介绍 在这里 cv2.…...

洛谷P8601[蓝桥杯][2013年第四届真题]剪格子

题目描述如图 11 所示&#xff0c;33 的格子中填写了一些整数。我们沿着图中的红色线剪开&#xff0c;得到两个部分&#xff0c;每个部分的数字和都是 60。本题的要求就是请你编程判定&#xff1a;对给定的 mn 的格子中的整数&#xff0c;是否可以分割为两个部分&#xff0c;使…...

配置alias实现快速生成.gitignore文件

git工具&#xff1a;版本控制开发工具。 cscope工具&#xff1a;用于浏览C源码的工具&#xff0c;类似于ctags。在代码根目录下执行cscope -Rbq&#xff0c;然后产生三个索引文件&#xff08;cscope.out、cscope.in.out和cscope.po.out三个文件&#xff09;。 在Linux下使用vi…...

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

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

LRU缓存算法

双向链表哈希表&#xff08;非线程安全&#xff09; https://leetcode.cn/problems/lru-cache/solutions/259678/lruhuan-cun-ji-zhi-by-leetcode-solution/ /*** LRU算法: 哈希表双向链表实现* 1. 双向链表按照被使用的顺序来存储, 靠近头部的节点是最近使用的, 靠近尾部的节…...

后进先出(LIFO)详解

LIFO 是 Last In, First Out 的缩写&#xff0c;中文译为后进先出。这是一种数据结构的工作原则&#xff0c;类似于一摞盘子或一叠书本&#xff1a; 最后放进去的元素最先出来 -想象往筒状容器里放盘子&#xff1a; &#xff08;1&#xff09;你放进的最后一个盘子&#xff08…...

springboot 百货中心供应链管理系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;百货中心供应链管理系统被用户普遍使用&#xff0c;为方…...

利用ngx_stream_return_module构建简易 TCP/UDP 响应网关

一、模块概述 ngx_stream_return_module 提供了一个极简的指令&#xff1a; return <value>;在收到客户端连接后&#xff0c;立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量&#xff08;如 $time_iso8601、$remote_addr 等&#xff09;&a…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销&#xff0c;平衡网络负载&#xff0c;延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...

条件运算符

C中的三目运算符&#xff08;也称条件运算符&#xff0c;英文&#xff1a;ternary operator&#xff09;是一种简洁的条件选择语句&#xff0c;语法如下&#xff1a; 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true&#xff0c;则整个表达式的结果为“表达式1”…...

STM32F4基本定时器使用和原理详解

STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战

“&#x1f916;手搓TuyaAI语音指令 &#x1f60d;秒变表情包大师&#xff0c;让萌系Otto机器人&#x1f525;玩出智能新花样&#xff01;开整&#xff01;” &#x1f916; Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制&#xff08;TuyaAI…...

Springboot社区养老保险系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;社区养老保险系统小程序被用户普遍使用&#xff0c;为方…...

论文笔记——相干体技术在裂缝预测中的应用研究

目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术&#xff1a;基于互相关的相干体技术&#xff08;Correlation&#xff09;第二代相干体技术&#xff1a;基于相似的相干体技术&#xff08;Semblance&#xff09;基于多道相似的相干体…...

短视频矩阵系统文案创作功能开发实践,定制化开发

在短视频行业迅猛发展的当下&#xff0c;企业和个人创作者为了扩大影响力、提升传播效果&#xff0c;纷纷采用短视频矩阵运营策略&#xff0c;同时管理多个平台、多个账号的内容发布。然而&#xff0c;频繁的文案创作需求让运营者疲于应对&#xff0c;如何高效产出高质量文案成…...