php小技巧三
2020-11-16 09:31:10 来源:admin 点击:760
使用标准类库
PHP标准库 (SPL)
SPL,即 PHP 标准库(Standard PHP Library),从 PHP 5.0 起内置的组件和接口,并且从 PHP5.3 已逐渐的成熟。SPL 其实在所有的 PHP5 开发环境中被内置,同时无需任何设置。然而 SPL 了似乎被我们无视了,我们总是喜欢造一些不靠谱的轮子也不愿意花时间去学习一些成熟的解决方案。通过 SPL 工具集合我们就可以轻松组装一把瑞士军刀,当然,我这么说可能有些苍白无力,如果你刷过算法和数据结构,你一定懂 SPL 的匠心。
实例之文件信息类
<?php
$filename = __DIR__ . '/a.txt';
$info = new SplFileInfo($filename);
var_dump($info->getBasename('.txt'));
var_dump($info->getExtension());
var_dump($info->getFilename());
var_dump($info->getGroup());
var_dump(date('Y-m-d H:i:s', $info->getCTime()));
var_dump(date('Y-m-d H:i:s', $info->getATime()));
var_dump($info->isDir());
var_dump($info->isFile());
var_dump($info->isReadable());
var_dump($info->isWritable());
var_dump($info->isExecutable());
var_dump($info->getOwner());
// 结果
string(1) "a"
string(3) "txt"
string(5) "a.txt"
int(20)
string(19) "2019-12-03 03:18:21"
string(19) "2019-12-03 03:18:22"
bool(false)
bool(true)
bool(true)
bool(true)
bool(false)
int(501)
实例之优先级队列
<?php
$queue = new SplPriorityQueue();
$queue->insert('A', 3);
$queue->insert('B', 6);
$queue->insert('C', 1);
$queue->insert('D', 2);
$queue->insert('E', 5);
$queue->insert('F', 4);
var_dump($queue->count());
while ($queue->valid()) {
echo $queue->current(), ' ';
$queue->next();
}
echo PHP_EOL;
var_dump($queue->compare('A', 'F'));
// 结果
int(6)
B E F A D C
int(-1)
其它
交换两个变量
<?php
$a = 1;
$b = 2;
[$b, $a] = [$a, $b];
var_dump($a, $b);
// 结果
int(2)
int(1)
或者
<?php
$a = 1;
$b = 2;
$a ^= $b;
$b ^= $a;
$a ^= $b;
var_dump($a, $b);
// 结果
int(2)
int(1)
<?php
$a = 1;
$b = 2;
$tmp = $a;
$a = $b;
$b = $tmp;
var_dump($a, $b);
// 结果
int(2)
int(1)
定义函数并立即执行
<?php
call_user_func(static function () {
echo 'Hello World!';
});
闭包当成对象的成员方法或者静态成员方法
关于 bind 和 bindTo 的官网文档解释有点绕,其实它们的功能与 JS 中的 call 和 apply 差求不多,另外 JavaScript 中 apply 、call 的详解
实例一
<?php
class Test
{
private function doSomething(array $array): array
{
return array_map('strtoupper', $array);
}
}
$test = new Test();
$func = function (array $array) {
return $this->doSomething($array);
};
$result = $func->bindTo($test, $test)(['a', 'b', 'c', 'd']);
var_dump($result);
// 结果
array(4) {
[0]=>
string(1) "A"
[1]=>
string(1) "B"
[2]=>
string(1) "C"
[3]=>
string(1) "D"
}
实例二
<?php
trait DynamicDefinition
{
public function __call(string $name, $args = null)
{
if (is_callable($this->{$name})) {
return call_user_func($this->{$name}, $args);
}
throw new \RuntimeException("Method {$name} does not exist");
}
public function __set(string $name, $value = null)
{
$this->{$name} = is_callable($value) ? $value->bindTo($this, $this) : $value;
}
}
class Foo
{
use DynamicDefinition;
private string $privateValue = 'I am private';
}
$foo = new Foo;
$foo->bar = function (...$arguments) {
$args = $arguments[0];
$prefix = implode('=>', $args);
return $prefix . ' ' . $this->privateValue;
};
print $foo->bar('hh', 'll', 'mm');
// 结果
Hh=>ll=>mm I am private
实例三
<?php
class Foo
{
private static int $a = 11;
private int $b = 22;
}
$aFunc = static function () {
return Foo::$a;
};
$bFunc = function () {
return $this->b;
};
$aResult = Closure::bind($aFunc, null, Foo::class);
$bResult = Closure::bind($bFunc, new Foo(), Foo::class);
var_dump($aResult(), $bResult());