这里主要介绍一些我知道的PHP的使用技巧。
1、PHP内置的Web Server
首先,有个问题:
如果你需要快速启动一个HTTP服务来调试PHP代码,你会怎么做?
启动php-fpm或php-cgi进程监听9000端口,然后使用Nginx将Http请求通过FastCGI接口转发给php-fpm或php-cgi进程?
这不失为一种方法,但是并不算方便。
其实,PHP 5.4.0后就提供了一个内置的Web服务器,你可以执行这个命令来启动它:
php -S 127.0.0.1:8080 a.php
然后就通过 http://127.0.0.1:8080 来进行访问了。
2、执行PHP代码时生成debug信息
在执行PHP代码时,你会用什么方法进行调试?
var_dump、print_r直接输出?
除了直接输出,你还可以使用debug模式配合IDE来进行调试。在执行PHP代码时,加上-e
参数,同时IDE开启debug监听(需要安装xdebug或yasd等调试类扩展,推荐yasd,它可以调试swoole协程):
php -e a.php
php -e artisan test:test
这样你就可以使用IDE的debug功能来调试你的PHP命令了。除此之外,还可以配合PHP的内置Web服务器一起使用:
php -e -S 127.0.0.1:8080 a.php
3、数组迭代
需要获取这个数组所有层级的子元素,你会怎么做?
$arr = [ 'key1' => 'value1', 'key2' => [ 'key3' => 'value2', 'key4' => [ 'value3', 'value4', ] ], 'key5' => 'value5' ];
使用递归?
没错,可以使用递归。你也可以选择另外一种方式:
$arr = [
'key1' => 'value1',
'key2' => [
'key3' => 'value2',
'key4' => [
'value3',
'value4',
]
],
'key5' => 'value5'
];
$it = new RecursiveArrayIterator($arr);
$recursiveIt = new RecursiveIteratorIterator($it);
foreach ($recursiveIt as $v) {
var_dump($v);
}
4、目录迭代
需要获取一个目录下所有层级的所有文件,你会怎么做?
这样使用dir迭代?
function test($dir) {
$dirHandle = dir($dir);
while ($item = $dirHandle->read()) {
if ($item == '.' || $item == '..') continue;
$path = "{$dir}/{$item}";
if (is_dir($path)) {
test($path);
} else {
var_dump($item);
}
}
}
你还可以用更简单的方法,同样也是PHP内置的迭代器:
$it = new RecursiveDirectoryIterator('./');
$reIt = new RecursiveIteratorIterator($it);
foreach ($reIt as $value) {
var_dump($value);
}
5、访问对象的私有属性
在使用一个库的对象时,想要访问该对象的私有属性,你会怎么做?
?
可以使用Closure
类的静态方法bind
或非静态方法bindTo
将函数绑定到该类的作用域下:
class A {
private $name = 'The name of A';
}
$a = new A();
// 方法一
$closure = Closure::bind(function () use ($a) {
var_dump($a->name);
}, null, A::class);
// 方法二,通过this访问
//$closure = Closure::bind(function () {
// var_dump($this->name);
//}, $a, A::class);
$closure();
6、fastcgi_request_finish
fastcgi_request_finish函数是PHP提供的在CGI模式下可用的方法。
调用此方法会将响应数据立即发送给用户,但不中断后续代码执行。例如:
echo 123;
echo 456;
fastcgi_finish_request(); // 此时将响应发送给用户
echo 789;
file_put_contents('a.txt', '789');
以上代码在CGI模式下执行,你会得到123456的响应数据,并且会生成a.txt文件,内容为789。
这个方法的主要用途就是跳过与响应无关的数据处理,提前返回数据给客户端,提高用户体验。
仅在CGI模式下可用,其他模式下会报方法不存在的错误
Laravel中Response的send方法也是用到了这个函数
7、续...
后续补充...