PHP8新功能之PhpToken类与Stringable接口
PhpToken类
PhpToken令牌生成类用于替换token_get_all()
函数,PhpToken::tokenize()
将所有令牌统一为PhpToken对象,具有更好的可操作性和可读性。
PHP8新功能PhpToken类案例
$code = "<?php echo 'hello world'; ?>";
// php8之前的写法
// $arr = token_get_all($code);
/*
返回结果如下
Array
(
[0] => PhpToken Object
(
[id] => 390
[text] => <?php
[line] => 1
[pos] => 0
)
)
*/
// 使用php8中PhpToken类
$arr = PhpToken::tokenize($code);
print_r($arr);
$obj = $arr[0];
echo $obj->id;
echo $obj->line;
echo $obj->pos;
官方手册:https://www.php.net/phptoken
Stringable接口
Stringable
接口表示拥有__toString()
方法的类。与大多数接口不同,Stringable隐式存在于任何定义了__toString()
魔术方法的类上,也可以显式声明它,但不推荐。
其主要价值是能让函数针对简单的字符串或可以转化为字符的对象,检测联合类型string|Stringable
。
这些定义可能不太好理解,还是看代码理解吧。
// 隐式实现Stringable
class Person
{
public function __toString()
{
return self::class;
}
}
// 显示实现Stringable
class Person implements Stringable
{
public function __toString()
{
return self::class;
}
}
__toString()
的作用是把类的实例对象当作字符串输出时就会调用的魔术方法。结果它的作用再来看看Stringable
接口的定义。一个类中只要使用了__toString()
魔术方法,那么这个类就已经继承了Stringable
接口,只不过是隐式的。
Stringable接口
interface Stringable {
/* 方法 */
public function __toString(): string
}
隐式实现
class Person
{
public function __toString()
{
return self::class;
}
}
显式实现
class Person implements Stringable
{
public function __toString()
{
return self::class;
}
}
instanceof检测是否隐式实现
class Person
{
public function __toString()
{
return self::class;
}
}
$p = new Person();
// true
var_dump($p instanceof Stringable);
类型约束
<?php
namespace php8;
class Person
{
public function __toString()
{
return self::class;
}
}
$p = new Person();
// 携带了命名空间时需要注意,
// Stringable接口是全局的
function aa(\Stringable $obj) {
echo strtoupper($obj);
}
aa(new Person());
我是温新
每天进步一点,就一点点
请登录后再评论