zhamao-framework/docs/component/global-functions.md
2021-01-07 16:01:01 +08:00

5.0 KiB
Raw Blame History

全局方法

全局方法就是 PHP 的全局函数,任意位置都可以调用,无需使用 use 字样。

getClassPath()

根据加载的用户编写的代码类名来获取类所在的文件路径。

=== "src/Module/Example/Hello.php"

```php
<?php
namespace Module\Example;
class Hello {  ...  }
```

=== "src/Module/Example/Start.php"

```php
<?php
namespace Module\Example;
use ZM\Annotation\Swoole\OnStart;
class Start {
	/**
	 * @OnStart()
	 */
	public function onStart() {
		Console::info("Path: ".getClassPath(Hello::class));
	}
}
```

=== "输出结果"

```
[11:12:02] [I] [#0] Path: /mnt/d/project/zhamao-framework/src/Module/Example/Hello.ph
```

explodeMsg()

切割字符串的函数支持多空格换行tab。

定义:explodeMsg($msg, $ban_comma = false)

$s = explodeMsg("你好啊 你好你好\n我还有多个空格      哈哈哈");
echo json_encode($s, 128|256); // ["你好啊","你好你好","我还有多个空格","哈哈哈"]

unicode_decode()

Unicode 解码,一般用于被转义的 Unicode 转回来。

echo unicode_decode("\u4f60\u597d"); // 你好

matchPattern()

根据星号匹配字符串(非正则表达式)。

匹配示例:

  • 你今天*了吗 -> 你今天喝水了吗
  • *的天气怎么样 -> 德州的天气怎么样
  • 把*翻译成* -> 把茶翻译成英语

定义:matchPattern($pattern, $context)

$pattern 为匹配模式,例如 你今天*了吗

$context 为要判断是否匹配的内容。

返回值:bool,当为 true 时代表规则是匹配的false 代表不匹配。

matchPattern("*是个啥?", "996是个啥"); // true
matchPattern("我想听*唱歌", "你想听谁唱歌"); // false
matchPattern("*把*翻译成*", "请把你好翻译成阿拉伯语"); // true

split_explode()

explodeMsg() 类似,用作分割字符串,不过此函数加入了对 中文|数字 两者的分割,也就是说中文和数字之间也会被分割。

定义:split_explode($del, $str, $divide_en = false)

split_explode(" ", "前进20 急啊急啊"); // ["前进","20","急啊急啊"]

$delexplode() 的第一个参数作用相同,作为初期分割的标志。

$str 表示待分割的内容。

$divide_en 表示是否分割中文和英文,如果为是,则中文和英文之间也会被分割开。

matchArgs()

matchPattern() 的扩展,如果 matchPattern() 格式的字符串和模式匹配成功,则通过星号位置来提取星号匹配到的内容,参数同 matchPattern()

$r = matchArgs("把*翻译成*", "把日语翻译成英语"); // ["日语","英语"]

connectIsQQ()

判断当前 WebSocket 连接是否为 OneBot 标准的机器人客户端。

connectIsDefault()

判断连接是否是未定义类型的 WebSocket 连接。

connectIs()

判断连接是否是对应类型的 WebSocket 连接。

connectIs("your_another_type_connect");

set_coroutine_params()

设置当前上下文中的一些变量。

set_coroutine_params(["data" => [
    "post_type" => "message",
    ...
]]);

ctx()

别名:context(),获取当前协程的上下文,见 上下文

zm_debug()

Console::debug($msg)

zm_sleep()

协程版 sleep() 函数。

定义:zm_sleep($s = 1)

$s睡眠的时间可支持小数。例如0.001 代表 1 毫秒)

为什么不用 PHP 自带的 sleep 呢?因为炸毛框架是基于协程的,协程版 sleep 需要使用 Swoole 自带的 sleep。此函数做了一个简单的封装。

zm_sleep(5);
zm_sleep(0.05);

zm_exec()

执行系统命令,替代 PHP 的 exec()

定义:zm_exec($cmd)

返回值:

array(
    'code'   => 0,  // 进程退出的状态码
    'signal' => 0,  // 信号
    'output' => 'hello world', // 输出内容
);
$result = zm_exec("echo 'hello world'")["output"];

zm_cid()

获取当前协程的 ID效果等同于 \Swoole\Coroutine::getCid()

zm_yield()

挂起当前协程,直到手动恢复,效果等同于 \Swoole\Coroutine::yield()

zm_resume()

恢复继续执行协程,效果等同于 \Swoole\Coroutine::resume()

$r = 0;
function test() {
    echo "hello-1\n";
    global $r;
    $r = zm_cid();
    zm_yield();
    echo "hello-2\n";
}

go("test");
echo "hello-3\n";
zm_resume($r);

输出结果:

hello-1
hello-3
hello-2

server()

获取 Swoole Server 对象进行操作,效果等同于 \ZM\Framework::$server

echo server()->worker_id.PHP_EOL; // 0

bot()

返回 ZMRobot 操作机器人 API 的对象。

对于默认的模式,如果框架连接了多个机器人实例,则会随机返回一个机器人的 API 实例。如果使用了单例模式,则返回单例模式的机器人 API 实例。

bot()->sendPrivateMsg(123456, "你好啊!!");
// 等同于 ZMRobot::getRandom()->sendPrivateMsg(123456, "你好啊!!");