PHP知识点
lavaral toArray
optional()->toArray();
获取进程id
ps -elf|grep docker|grep -v grep|awk '{print $4}'
ps aux | grep docker | awk '{print $2}'
时间 日期
//获取当前月份共有多少天
$weeks_days = date("d", strtotime(date("Y-m-01", strtotime($nowdate)) . " +1 month -1 day"));
PHPexcel 隐藏列
$objPHPExcel->getActiveSheet()->getColumnDimension('H')->setVisible(false);
简单方式输出需要转义的字符
$a=<<<张继康
带有任何字符的任何文本
张继康;
CSS苹果5修改根文字大小
@media screen and (max-width: 320px) {
:root {
font-size: 16px;
}
}
网页报错整理
413 nginx.ini 没有client_max_body_size配置
三目运算符
$a??'yes':'no'
if...else ... 判断的其他写法
$age = '5';
if ($age < 15):
echo '还没有15岁的小孩子';
elseif ($age < 30):
echo '还没有到30岁的中年人';
else:
echo '大人';
endif;
文件引入的方式 include ,require区别
include 当文件不存在时,只出现警告,不会终止程序,文件存在时,每次被应用都会被引用
require 当文件不存在时,会出现致命错误,并且终止程序.
文件引入的方式 include_once ,require_once区别
include_once 当文件不存在时,只出现警告,不会终止程序,文件存在时只会引用第一次.
require_once 当文件不存在时,会出现致命错误,并且终止程序,当文件存在时只会被应用一次
命名空间释义
a.php 有个make方法,输出a
B.php 文件有个make方法,输出B
C文件同时引用AB文件会出现问题,那么 给A和B 写命名空间,分别是:
namespace a;
namespace b;
然后在C里 调用a/make 和 b/make 就不会冲突
传值 传址
function show($va){
$va ++ ;
echo $va
}
$va = 1;
echo show($va);
当形参没有&号时,函数体内部和外部的$是不同的,形参有&符时候,内外用的是同一个变量.
点语法
function sum(...$a){
return array_sum($a);
}
echo sum(1,2,2,3,3,4,4,5);
不确定值有多少个的时候就可以用点语法.
字符串用*号代替
function mobile($tel,$num=4,$fix = '*'){
return substr($tel,0,-1*$num) .str_repeat($fix,$num);
}
echo mobile('11122222121',3);
例子是手机号几位数用*代替.
严格模式,形参格式限制
declare(strict_types=1);
//function show(int $num)
//{
// return $num;
//}
//
//var_dump(show('2'));
function sum(int ...$nums)
{
return array_sum($nums);
}
try {
echo sum(1, 2, 3, '5');
} catch (\Throwable $th) {
echo $th->getMessage();
}
返回值格式限制
function sum(): ?string // 问号的意思就是可空或字符串
{
return null;
}
try{
echo sum();
}catch (\Throwable $th){
echo $th->getMessage();
}
static
static 第一次调用函数的时候执行,接下来的调用不再次执行.
function sum(int ...$nums): int
{
static $count = 0;
return $count += array_sum($nums);
}
echo sum(1, 2, 3);
echo '<br/>';
echo sum(1, 2, 3);
截取文件名后缀
$file = 'Ricker.jpg';
$ext = trim(strrchr($file, '.'), '.').strtolower($ext);
$ext = strtolower(substr(strrchr($file,'.'),1));
判断函数是否存在
if (function_exists($action)) {
echo $action($file);
} else {
echo '系统不能处理此类型';
}
递归函数
function recursive($num){
if($num==1){
return $num;
}
return $num*recursive($num-1);
}
echo recursive(5);
索引数组、关联数组
//索引数组
$arr = [1, 2, 3,];
print_r($arr[1]);
//关联数组
$article = [
'title'=>'Visual Studio Code',
'created_at'=>"2020-2-22"
];
echo $article['title'];
list函数
// $arr = ['张继康','Ricker'];
// list($a,$b) = $arr;
// echo $b;
//$user = ['name'=>'张继康','age'=>33];
//list('name'=>$name,'age'=>$ag) = $user;
//echo $ag;
// $arr = ['张继康','Ricker','yuhuangdadi.xyz'];
// list(,,$web) = $arr;
// echo $web;
foreach
$users = [
['name' => '张继康大叔', 'age' => '16',],
['name' => '小明', 'age' => '19',],
['name' => '张三', 'age' => '23',],
['name' => '李四', 'age' => '16',],
];
//想修改数组的某个值,比如这个数组的年龄字段都增加50岁,有以下2个方式
foreach ($users as $key => $user) {
$users[$key]['age'] += 50; //这是第一种方式
//foreach ($users as $key => &$user) { //这是第二种方式
echo $key.'='.$user['name'].'<br/>';
}
数组操作函数
array_pop 删除最后一个元素
<?php
$a=array("red","green","blue");
array_pop($a);
print_r($a);
?>
array_push 向数组压入一个元素
<?php
$a=array("red","green");
array_push($a,"blue","yellow");
print_r($a);
?>
array_shift 删除数组中的第一个元素(red),并返回被删除元素的值:
<?php
$a=array("a"=>"red","b"=>"green","c"=>"blue");
echo array_shift($a);
print_r ($a);
?>
把元素 "blue" 插队到数组的第一个元素之前:
<?php
$a=array("a"=>"red","b"=>"green");
array_unshift($a,"blue");
print_r($a);
?>
判断数组内是否含有某个值
<?php
$allowImageType = ['jpeg'=>2000000,'jpg'=>2000000,'png'=>2000000];
$file = 'Ricker.png';
$ext = strtolower(substr(strrchr($file,'.'),1));
if(!array_key_exists($ext,$allowImageType)){
echo 'wrong';
}else{
echo 'success';
}
数组操作
<?php
//array_filter
$users = [
['name' => '张继康大叔', 'age' => '16',],
['name' => '小明', 'age' => '19',],
['name' => '张三', 'age' => '23',],
['name' => '李四', 'age' => '16',],
];
$filterUsers = array_filter($users,function($user){
return $user['age']>20;
});
print_r($filterUsers);
数组操作
<?php
//一个数组,只要name字段,或者统一增加一个sex字段
$users = [
['name' => '张继康大叔', 'age' => '16',],
['name' => '小明', 'age' => '19',],
['name' => '张三', 'age' => '23',],
['name' => '李四', 'age' => '16',],
];
$names = array_map(function($user){
return $user['name'];
},$users);
print_r($names);
//$mapUsers = array_map(function($user){
// unset($user['age']);
// $user['class'] = 'yuhuangdadi.xyz';
// return $user;
//},$users);
//print_r($mapUsers);
数组操作
<?php
// 数组内每一个元素执行一个回调函数,比如杰鸿的每个模型的D函数,用来处理列表页的数据
$users = [
['name' => '张继康大叔', 'age' => '16',],
['name' => '小明', 'age' => '19',],
['name' => '张三', 'age' => '23',],
['name' => '李四', 'age' => '16',],
];
$stringUsers = array_map(function($user){
return implode('-',array_values($user));
},$users);
print_r($stringUsers);
分页
$total = 100;
echo min($total,max(1,$_GET['page']??1));
setcookie
第四个参数是设置路径,规定cookie只可以在某个文件夹里访问使用,设置为/
第五个参数是设置域名,默认本域名,可以设置主域名之后 就可以被子域名访问 设置为空就是本域名
session
session_save_path 可以设置session的路径,一个服务器有十个网站的话 就可以区分开目录 优化性能
不然的话 一个文件夹有十万个sessin的文件,导致性能下降
放在start之前使用
定时任务
定时的概念就是做一个算式,当结果等于期望的值 再执行某些操作.
声明类方法的关键字
public - 默认 可以不写,但最好写上
protected 受保护的方法,可以被子类访问
private 收保护的方法
子类不可以重父亲的关键字
父亲的方法名加上 final 子类(不小心)重写的时候就会报错
抽象类
关键字是:abstract
有抽象方法的类叫做抽象类
抽象类内规定了一个ab开头的类的话,子类必须要实现
构造函数
class class_name{
function __construct($name,$sex,$age){
$this->name = $name;
$this->age = $age;
$this->sex = $sex;
}
}
new class_name('张三','李四','18');
获取用户ip地址
function getIp()
{
if (!empty($_SERVER["HTTP_CLIENT_IP"])){
$cip = $_SERVER["HTTP_CLIENT_IP"];
} elseif (!empty($_SERVER["HTTP_X_FORWARDED_FOR"])) {
$cip = $_SERVER["HTTP_X_FORWARDED_FOR"];
} elseif (!empty($_SERVER["REMOTE_ADDR"])) {
$cip = $_SERVER["REMOTE_ADDR"];
} else {
$cip = '';
}
preg_match("/[\d\.]{7,15}/", $cip, $cips);
$cip = isset($cips[0]) ? $cips[0] : 'unknown';
unset($cips);
return $cip;
}
清除一段富文本内容中的图片
$html_string = htmlspecialchars_decode($post['details']);
$content = str_replace(" ", "", $html_string);
$contents = strip_tags($content);
$text = mb_substr($contents, 0, 20, "utf-8");
获取2个时间的差距 时间差
/**
* @User : Mr.Zhang
* @Date : 2020/9/7
* @Time : 15:52
*
* @param $date1
* @param $date2
*
* @return array
*
* No time order, return a positive integer
*/
function diffDate($date1, $date2)
{
if (strtotime($date1) > strtotime($date2)){
$tmp = $date2;
$date2 = $date1;
$date1 = $tmp;
}
list($Y1, $m1, $d1) = explode('-', $date1);
list($Y2, $m2, $d2) = explode('-', $date2);
$Y = $Y2 - $Y1;
$m = $m2 - $m1;
$d = $d2 - $d1;
if ($d < 0){
$d += (int) date('t', strtotime("-1 month $date2"));
$m--;
}
if ($m < 0){
$m += 12;
$y--;
}
return [ '0' => $Y, '1' => $m, '2' => $d ];
}
通过身份证号码获取用户年龄
/**
* @User : Mr.Zhang
* @Date : 2020/9/7
* @Time : 15:52
*
* @param $IdCard identification number
*
* @return array
*
*/
function getIdCardAge($IdCard)
{
$IdCard = str_replace(' ', '', $IdCard);
$IdCard = trim($IdCard);
if ( strlen($IdCard) == 15 || strlen($IdCard) == 18 ){
if (strlen($IdCard) == 15){
$birthday = '19' . substr($IdCard, 6, 6);
}
if (strlen($IdCard) == 18){
$birthday = substr($IdCard, 6, 8);
}
$time1 = date("Y-m-d", strtotime($birthday));
$time2 = date("Y-m-d");
return diffDate($time1, $time2);
}
return false;
}
通过身份证号获取用户性别
/**
* @User : Mr.Zhang
* @Date : 2020/9/7
* @Time : 15:52
*
* @param $IdCard identification number
* @param $man default 1
* @param $woman default 2
*
* @return Int OR Bool OR String
*
* The default returns 1 or 0 1 means male 2 means female
*/
function getIdCardSex($IdCard, $man = 1, $woman = 0)
{
$IdCard = str_replace(' ', '', $IdCard);
$IdCard = trim($IdCard);
if ( strlen($IdCard) == 15 || strlen($IdCard) == 18 ){
return substr($IdCard, ( strlen($IdCard) == 18 ? -2 : -1 ), 1) % 2 ? $man : $woman;
}
return false;
}
获取2个日期之间的日期 数组方式返回
function periodDate($start_time, $end_time)
{
$start_time = strtotime($start_time);
$end_time = strtotime($end_time);
$i = 0;
while ($start_time <= $end_time) {
$arr[$i] = date('Y-m-d', $start_time);
$start_time = strtotime('+1 day', $start_time);
$i++;
}
return $arr;
}