PHP特性 yield生成器
转载
https://segmentfault.com/a/1190000012334856
https://segmentfault.com/a/1190000012334856
$post = [
'page' => 10,
'b' => 200
];
$page = $post['page'] ?? 1;
// 等价于
$page = isset($post['page']) ? $post['page'] :1;
$page = $post['page'] ?: 1;
// 等价于
$page = $post['page'] ? $post['page'] :1;
// 这个是上传文件的方法 失败返回false
$res = $this->uploadfile();
$img_path = $res ?: '';
$a??1;
$a?:1;
转自:https://learnku.com/articles/60741
1、xls
application/vnd.ms-excel
2、xlsx
application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
3、ppt
application/vnd.ms-powerpoint
4、pptx
application/vnd.openxmlformats-officedocument.presentationml.presentation
5、doc
application/msword
6、docx
application/vnd.openxmlformats-officedocument.wordprocessingml.document
7、zip
application/x-zip-compressed
8、rar
application/x-zip-compressed
9、wmv
video/x-ms-wmv
10、mp3
audio/mpeg
11、mp4
video/mp4
12、gif
image/gif
13、jpg
image/jpeg
14、png
image/png
15、bmp
image/bmp
16、psd
application/octet-stream
17、ico
image/x-icon
18、7z
application/octet-stream
19、exe
application/octet-stream
20、avi
video/avi
21、rmvb
application/vnd.rn-realmedia-vbr
22、3gp
application/octet-stream
23、flv
application/octet-stream
24、wav
audio/wav
25、krc
application/octet-stream
26、lrc
application/octet-stream
27、txt
text/plain
28、pdf
application/pdf
29、chm
application/octet-stream
30、mdb
application/msaccess
31、sql
application/octet-stream
32、con
application/octet-stream
33、log
text/plain
34、dat
application/octet-stream
35、ini
application/octet-stream
36、php
application/octet-stream
37、html 和 htmhtm
text/html
38、ttf
application/octet-stream
39、fon
application/octet-stream
40、js
application/x-javascript
41、xml
text/xml
42、dll
application/octet-stream
转自:https://learnku.com/articles/60802
products
商品表字段名称 | 描述 | 类型 | 加索引缘由 |
---|---|---|---|
id | 自增长ID | unsigned big int | 主键 |
title | SKU 名称 | varchar | 无 |
description | SKU 描述 | varchar | 无 |
price | SKU 价格 | decimal | 无 |
stock | 库存 | unsigne int | 无 |
product_id | 所属商品 id | unsigne big int | 外键 |
orders
订单表字段名称 | 描述 | 类型 | 加索引缘由 |
---|---|---|---|
id | 自增长ID | unsigned big int | 主键 |
no | 订单流水号 | varchar | 唯一 |
user_id | 下单的用户ID | unsigned big int | 外键 |
address | JSON格式的收货地址 | text | 无 |
total_amount | 订单总金额 | decimal | 无 |
remark | 订单备注 | text | 无 |
paid_at | 支付时间 | datetime, null | 无 |
payment_method | 支付方式 | varchar, null | 无 |
payment_no | 支付平台订单号 | varchar, null | 无 |
refund_status | 退款状态 | varchar | 无 |
refund_no | 退款单号 | varchar, null | 唯一 |
closed | 订单是否已关闭 | tinyint, default 0 | 无 |
reviewed | 订单是否已评价 | tinyint, default 0 | 无 |
ship_status | 物流状态 | varchar | 无 |
ship_data | 物流数据 | text, null | 无 |
extra | 其他额外的数据 | text, null | 无 |
order_sku
订单项目名字段名称 | 描述 | 类型 | 加索引缘由 |
---|---|---|---|
id | 自增长ID | unsigned big int | 主键 |
order_id | 所属订单ID | unsigned big int | 外键 |
product_id | 对应商品ID | unsigned big int | 外键 |
product_sku_id | 对应商品SKU ID | unsigned big int | 外键 |
amount | 数量 | unsigned int | 无 |
price | 单价 | decimal | 无 |
rating | 用户打分 | unsigned int, null | 无 |
review | 用户评价 | text | 无 |
reviewed_at | 评价时间 | timestamp, null | 无 |
// 加载opcache(需确认已安装opcache拓展)
zend_extension=opcache.so
// 开启opcache
opcache.enable = 1
// OPcache共享内存存储大小,单位MB
opcache.memory_consumption=1024 // 1G
// PHP使用了一种叫做字符串驻留,默认是4MB
opcache.interned_strings_buffer=32
// 这个选项用于控制内存中最多可以缓存多少个PHP文件,这个选项必须得设置得足够大,大于你的项目中的所有PHP文件的总和
opcache.max_accelerated_files=80000
// 设置缓存的过期时间(单位是秒),为0的话每次都要检查
opcache.revalidate_freq=3
// 从字面上理解就是“允许更快速关闭”
opcache.fast_shutdown=1
// CLI环境下,PHP启用OPcache
opcache.enable_cli=1
附:面向切面编程(AOP是Aspect Oriented Program的首字母缩写) ,我们知道,面向对象的特点是继承、多态和封装。而封装就要求将功能分散到不同的对象中去,这在软件设计中往往称为职责分配。实际上也就是说,让不同的类设计不同的方法。这样代码就分散到一个个的类中去了。这样做的好处是降低了代码的复杂程度,使类可重用。
但是人们也发现,在分散代码的同时,也增加了代码的重复性。什么意思呢?比如说,我们在两个类中,可能都需要在每个方法中做日志。按面向对象的设计方法,我们就必须在两个类的方法中都加入日志的内容。也许他们是完全相同的,但就是因为面向对象的设计让类与类之间无法联系,而不能将这些重复的代码统一起来。
也许有人会说,那好办啊,我们可以将这段代码写在一个独立的类独立的方法里,然后再在这两个类中调用。但是,这样一来,这两个类跟我们上面提到的独立的类就有耦合了,它的改变会影响这两个类。那么,有没有什么办法,能让我们在需要的时候,随意地加入代码呢?这种在运行时,动态地将代码切入到类的指定方法、指定位置上的编程思想就是面向切面的编程。
一般而言,我们管切入到指定类指定方法的代码片段称为切面,而切入到哪些类、哪些方法则叫切入点。有了AOP,我们就可以把几个类共有的代码,抽取到一个切片中,等到需要时再切入对象中去,从而改变其原有的行为。
这样看来,AOP其实只是OOP的补充而已。OOP从横向上区分出一个个的类来,而AOP则从纵向上向对象中加入特定的代码。有了AOP,OOP变得立体了。如果加上时间维度,AOP使OOP由原来的二维变为三维了,由平面变成立体了。从技术上来说,AOP基本上是通过代理机制实现的。
AOP在编程历史上可以说是里程碑式的,对OOP编程是一种十分有益的补充。
https://www.iteye.com/blog/hejiajunsh-1776569
http://open-doc.dingtalk.com/microapp/serverapi2/vzzrkv
中下载PHP
版本SDK
。解压后文件目录如图:dingtalk
中的文件,删除aliyun、QimenCloud
目录,保留top
目录Autoloader.php
和TopSdk.php
文件。composer.json
中:"autoload": {
"classmap": [
"database"
],
"files":[
"app/Packages/taobao/TopSdk.php"
],
"psr-4": {
"App\\": "app/"
}
}
composer dump-autoload
Controller
中就可以直接使用DingTalk SDK
了。测试结果如下(注意要加‘ \ ’):object(DingTalkClient)#276 (9) { ["gatewayUrl"]=> string(34) "http://eco.taobao.com/router/rest" ["format"]=> string(4) "json" ["connectTimeout"]=> NULL ["readTimeout"]=> NULL ["apiCallType"]=> string(4) "oapi" ["httpMethod"]=> string(4) "POST" ["checkRequest"]=> bool(true) ["apiVersion":protected]=> string(3) "2.0" ["sdkVersion":protected]=> string(25) "dingtalk-sdk-php-20161214" }
本文转载:https://blog.csdn.net/xiaoweite1/article/details/106175892
composer.json
对应的是composer update
composer.lock
对应的是composer install
,
注意:没有.lock
文件composer
就执行.json
文件;
1、可以将 Composer
降级到 1.x
版,操作如下:
composer self-update --1
2、如果您需要切换回 Composer
2.x
版,只需键入:
composer self-update --2
3、更多信息https://5balloons.info/fix-you-are-using-composer-2-some-plugins-seem-to-be-incompatible-with/
composer install -o —no-dev