-->

PHP资讯

您的当前位置:首页 > 资讯 > PHP基础

php小技巧三

2020-11-16 09:31:10  来源:admin 点击:497

使用标准类库

 

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());


相关文章更多 >

© 2024版权所有 水水网

电话:171780793