PHP开发中的使用到的一些知识点(持续更新)

这篇文章用来记录开发中遇到的一些小问题的解决方案,会保持持续更新。

call_user_func()函数和call_user_func_array()函数

一种奇特的调用方式,看下面的使用示例,使用类的方法变得更加灵活了。

<?php

class Test
{
    public function do(str)
    {
        echostr . PHP_EOL;
    }

}

class Stest
{
    public static function do(a,b)
    {
        var_dump(a +b);
    }
}

// 调用内置函数
a = call_user_func('explode', ',', '1,2,3');
var_dump(a);

a = call_user_func_array('explode', [',', '1,2,3']);
var_dump(a);

// 匿名函数调用
b = call_user_func(function(x, y){
    returnx - y;
}, 13, 9);
var_dump(b);

b = call_user_func_array(function(x, y){
    returnx + y;
}, [11, 22]);
var_dump(b);

p = 10;b = call_user_func_array(function(x,y) use(p){
    returnx + y +p;
}, [11, 22]);
var_dump(b);

// 调用对象的方法
call_user_func([(new Test()), 'do'], '99999888888');

// 静态方法调用class = 'STest';
call_user_func([class, 'do'], 12, 10);
call_user_func_array([class, 'do'], [88, 10]);

// 静态方法另外一种写法
call_user_func(class . '::do', 12, 10);
call_user_func_array(class . '::do', [88, 10]);

统计富文本提交中文文本的长度:

$length = mb_strlen(strip_tags(htmlspecialchars_decode($data['content'])),'UTF8');

其中,htmlspecialchars_decode()反转义html标签,strip_tags()去掉标签,mb_strlen($str,'UTF8')统计长度。

php判断进程是否存在,不存在则重启

    public function checkQueue()
    {
        cmd = 'ps axu | grep "queue" | grep -v "grep" | wc -l';ret = shell_exec("cmd");ret = rtrim(ret, "\r\n");

        if(ret === "0") {
            php_path = '/www/test/index.php'; //php脚本路径start_cmd = "nohup " . php_path . " queue >> /www/test/log/queue.log 2>&1 &";ret = shell_exec("$start_cmd");
        }
    }

自动加载函数spl_autoload_register()的使用

这个函数在很多框架的自动加载机制中都有用到,了解一下。在根目录新建一个子文件夹class,里面有一个类文件Dog.php

<?php
class Dog
{
    public function doSomething()
    {
        echo 'SAY: "Hello world!!!"';
    }

}

在根目录运行index.php

<?php
class AutoLoader {
    public static _path = __DIR__ . '/class/';

    public static function run(class) {
        file = self::_path . class . '.php';         if (is_file(file)) {
            require_once(file);         }
    }
}

spl_autoload_register("AutoLoader::run");
// 另外一种写法 spl_autoload_register(array('AutoLoader', 'run'));obj = new Dog();
$obj->doSomething();
// 运行结果 SAY: "Hello world!!!"

当使用一个未被引入的类时(示例中的Dog类),spl_autoload_register()会运行AutoLoader类的run方法,根据类名和事先约定好的路径,去尝试加载这个类,代码得以正常运行,这在框架中新建类的自动加载时很有用。

自动获取第一天最后一天

// 当前时间2019-04-11
echo date("Y-m-d", strtotime("2019-02 first day of")).'<br>';    // 2019-02-01
echo date("Y-m-d", strtotime("2019-02 last day of")).'<br>';     // 2019-02-28
echo date("Y-m-d", strtotime("2019-05 last day of")).'<br>';     // 2019-05-31
echo date("Y-m-d", strtotime("first day of")).'<br>';            // 2019-04-01
echo date("Y-m-d", strtotime("last day of")).'<br>';             // 2019-04-30

上面是使用PHP自带的时间函数来处理日期问题,处理更复杂一些的日期相关问题,强烈建议使用第三方包Carbon

二维数组中某个字段求和

$arr = [
    ['date' => "2019-03-06", "count" => 129],
    ['date' => "2019-03-13", "count" => 101],
    ['date' => "2019-03-28", "count" => 244],
];
echo array_sum(array_column($arr, 'count'))]; 
// 474

2019/06/11更新:

pathinfo()中文目录返回结果不正确的问题

当你的目录中含有中文时,pathinfo()将会返回不正确的数据;我们需要自己实现一个mb_pathinfo()函数来兼容中文目录的情况。

/**
 * 兼容中文目录的pathinfo
 * @param filepath
 * @return array
 */
function mb_pathinfo(filepath)
{
    path_parts = array();path_parts ['dirname'] = rtrim(substr(filepath, 0, strrpos(filepath, '/')), "/");
    path_parts ['basename'] = ltrim(substr(filepath, strrpos(filepath, '/')), "/");path_parts ['extension'] = substr(strrchr(filepath, '.'), 1);path_parts ['filename'] = ltrim(substr(path_parts ['basename'], 0, strrpos(path_parts ['basename'], '.')), "/");
    return path_parts;
}file = '/opt/upload/source/新建文件夹/unzip_5cf8bd06c8aea.docx';

var_dump(pathinfo(file));
var_dump(mb_pathinfo(file));

/*
array(4) {
  ["dirname"]=>
  string(34) "/opt/upload/source/新建文件夹"
  ["basename"]=>
  string(40) "新建文件夹/unzip_5cf8bd06c8aea.docx"
  ["extension"]=>
  string(4) "docx"
  ["filename"]=>
  string(35) "新建文件夹/unzip_5cf8bd06c8aea"
}
array(4) {
  ["dirname"]=>
  string(34) "/opt/upload/source/新建文件夹"
  ["basename"]=>
  string(24) "unzip_5cf8bd06c8aea.docx"
  ["extension"]=>
  string(4) "docx"
  ["filename"]=>
  string(19) "unzip_5cf8bd06c8aea"
}
*/

从目录中获取指定后缀的所有文件

/**
 * 获取文件夹内文件
 * @param array result 结果集
 * @param stringdir 目录
 * @param array filter 后缀过滤,为空即全部文件
 */
public static function getFilesFromDir(&result, dir,filter = [])
{
    files = array_diff(scandir(dir), array('.', '..'));
    if (is_array(files)) {
        foreach (files as value) {
            if (is_dir(dir . '/' . value)) {
                self::getFilesFromDir(result, dir . '/' .value, filter);
            } else {pathinfo = pathinfo(dir . '/' .value);
                extension = array_key_exists('extension',pathinfo) ? pathinfo['extension'] : '';
                if (empty(filter) || (!empty(filter) && in_array(extension, filter))) {result[] = dir . '/' .value;
                }
            }
        }
    }
}
PHP开发中的使用到的一些知识点(持续更新)

原文链接:https://beltxman.com/2468.html,若无特殊说明本站内容为 行星带 原创,未经同意禁止转载。

Scroll to top