杜建军 发布的文章

不会吧,不会吧。都21世纪了,还有不会用 composer 的 phper?

1. 创建composer.json文件

{
    "autoload":{
        "psr4":{},
        "psr0":{},
        "files":[],
        "classmap":[]
    }
}

自动加载文件的大致架构如上。

2.psr4加载

遵循psr4规范加载,不用在文件目录中体现命名空间。composer.json 格式如下

{
    "autoload": {
    "psr-4": {
      "App\\": "app"
    }
}
app\DemoPsr4
<?php

namespace App;
class DemoPsr4
{
    public function __construct()
    {
        echo "psr4加载";
    }

}
public/index.php
<?php
require "../vendor/autoload.php";

// psr4 加载。
$p4 = new App\TestPsr4();

3. 生成自动加载文件

在运行测试前,要使用composer命令生成自动加载文件

composer dumpautoload

现在运行 index.php 。即可输出 “psr4加载” 字样

4. psr0 加载

当使用psr0规范时,需要在文件目录中创建一个和‘命名空间’名称相同的目录

composer.json
{
  "autoload": {
    "psr-4": {
      "App\\": "app"
    },
    "psr-0": {
      "Bpp\\": "bpp"
    }
  }
}
bpp/Bpp/DemoPsr0.php
<?php

namespace Bpp;
class DemoPsr0
{
    public function __construct()
    {
        echo "psr0自动加载。";
    }
}
public/index.php
<?php
require "../vendor/autoload.php";

$p4 = new App\TestPsr4();
$p0 = new Bpp\TestPsr0();

运行 composer dumpautoload 生成自动加载文件。
然后运行public/index.php,会发现 psr0 类中的输出语句执行了

5.classmap

classmap 后面是个数组,写一个目录进去。会扫描这个目录下所有的文件。生成一个 类与文件名对应的数组。可以不用遵循任何标准,可以不写命名空间,甚至类名和文件名不相同都行。

具体文件见文件 “classmap”文件夹下

6.files

上面方法都是加载‘类文件’,如果需要加载一个php文件,这个php文件里写的是函数。就要使用 files 字段了。

详细代码见文件,'helper.php'

代码地址:https://github.com/jianwi/composer_autoload.git

客户需求:

A、B、C、D选项→ABCD选项
A、B、C、D其他→A、B、C、D其他

选项不定

当选项后面是"选项"的时候,替换掉、后面是其他的时候,不替换

思路:

替换一般可以匹配分组或者直接匹配要替换的字符。因为选项是不定的,所以不能用分组。

那么,就匹配 "、" 吧。

" 、" 前面是字母,逆向环视:(?<=[A-Z])

必须以 字母+选项 结尾,正向环视: (?=.*?[A-Z]选项$)

于是得到正则表达式

(?<=[A-Z])、(?=.*?选项$)

需求发生变化:

$A$、$B$、$C$、$D$选项
$A$、$B$、$C$、$D$、$E$选项
$A$、$B$、$C$选项
替换掉 $和、

$A$、$B$、$C$、选项 ,这种不替换

要替换掉$ 不是简单修改几个符号就能解决的,

分三步:

  1. 每个字母前面都有一个$,匹配这个$。\$(?=[A-Z])
  2. 匹配字母后面的 $、 。(?<=[A-Z])\$、
  3. 匹配选项前面的 $ 。 \$(?=选项$)

每句最后边是 $选项。(?=.*\$选项$)

选项前面的 \$ 也要替换掉

得到正则表达式:

((\$(?=[A-Z])|(?<=[A-Z])\$、)(?=.*\$选项$)|\$(?=选项$))

把最后处理完的数据生成一个 excel 文件。这是一个很常见的需求,每次都百度去找很浪费时间。处理 excel 的库太多了。
我们使用 openpyxl

1. 安装 openpyxl

pip install openpyxl

2. 使用它

# 第一步肯定是把包导进来呀
import openpyxl

# 先建一个 workbook
wb = openpyxl.Workbook()

# 然后 active 它,后面用这个 active 对象添加数据
wb_act = wb.active

# 添加数据,使用 append 方法 ,参数是一个 list ,表示excel中的一行数据。
wb_act.append(['row1,col1','row1,col2'])
wb_act.append(['row2,col1', 'row2,col2'])

# 上面我们添加了两行数据,你也可以添加很多行的。

# 然后保存成 excel 文件吧,这时候用 wb 对象的 save 方法保存,参数是文件的名称。
wb.save("../output.xlsx")

Maybe,当你浏览 github 的时候,你可能会发现有些python项目的根目录下有这样一个文件 requirements.txt ,里面描述了此项目使用了哪些扩展包,以及扩展包的版本。就像 js 项目的 package.json ,php 项目的 composer.json。

你可能感觉很不错,这是个优雅的解决方案。于是照猫画虎,在自己的项目根目录下也定义了这样一个文件。回忆了一下用到的包,但是包版本却不知道。

那么,python 就没有一个如 composer 般好用的包管理工具了吗?通过百度一番,找到了答案。其实 requirements.txt 文件是可以命令行生成的。

生成 requirements.txt

在根目录运行:

pip freeze > requirements.txt

通过 requirements.txt 安装

pip install -r requirements.txt

这是由于 mysql 版本太低造成的,你升级一下mysql就行

但是,有更省事的操作。

给 appServiceProvider 的boot 方法里添加

\Schema::defaultStringLength(191); 

这就搞定了,发个博客,方便以后复制粘贴。。。