PHP8新功能之PhpToken类与Stringable接口

作者: 温新

分类: 【PHP基础】

阅读: 2187

时间: 2022-01-26 06:39:21

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

我是温新

每天进步一点,就一点点

请登录后再评论