PHP中一些好用的技巧

这里主要介绍一些我知道的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、续...

后续补充...