{wc:php:start} 框架,PHP开发中的使用到的一些知识点(持续更新)

邵城
2023-12-01

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

call_user_func()函数和call_user_func_array()函数

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

class Test

{

public function do($str)

{

echo $str . 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){

return $x - $y;

}, 13, 9);

var_dump($b);

$b = call_user_func_array(function($x, $y){

return $x + $y;

}, [11, 22]);

var_dump($b);

$p = 10;

$b = call_user_func_array(function($x, $y) use($p){

return $x + $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:

class Dog

{

public function doSomething()

{

echo 'SAY: "Hello world!!!"';

}

}

在根目录运行index.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")).'
'; // 2019-02-01

echo date("Y-m-d", strtotime("2019-02 last day of")).'
'; // 2019-02-28

echo date("Y-m-d", strtotime("2019-05 last day of")).'
'; // 2019-05-31

echo date("Y-m-d", strtotime("first day of")).'
'; // 2019-04-01

echo date("Y-m-d", strtotime("last day of")).'
'; // 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 string $dir 目录

* @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开发中的使用到的一些知识点(持续更新)

更多精彩,敬请关注本博微信公众号:hsu1943

 类似资料: