phpfn / symbol
2.0.1
2020-08-09 02:40 UTC
Requires
- php: >=7.4
Requires (Dev)
- phpunit/phpunit: ^9.0
This package is auto-updated.
Last update: 2024-09-23 06:23:04 UTC
README
Symbol 是一种特殊的原始数据类型,表示一个唯一的标识符。此 symbol
库实现类似于其他类型,例如
- JavaScript 中的符号: https://mdn.org.cn/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol
- Ruby 中的符号: https://doc.ruby-lang.org.cn/core-2.5.0/Symbol.html
- TypeScript 中的符号: https://typescript.net.cn/docs/handbook/symbols.html
- Erlang 中的原子: https://erlang.org.cn/doc/reference_manual/data_types.html#atom
- ...例如
安装
可以将库安装到任何 PHP 应用程序中
$ composer require phpfn/symbol
为了访问库,请确保在文件中包含 vendor/autoload.php
。
<?php require __DIR__ . '/vendor/autoload.php';
用法
为了创建新的符号数据类型,您应使用 Symbol::create()
方法或调用全局的 symbol()
辅助函数。
<?php $a = symbol(); // OR $b = \Fun\Symbol\Symbol::create();
名称
每个符号都可以有一个名称(描述),作为第一个参数传递。
<?php $symbol = symbol('id');
唯一性
请注意,符号是唯一的,无论名称如何。
<?php var_dump(symbol() === symbol()); // expected output: false var_dump(symbol('example') === symbol('example')); // expected output: false
在常量中使用
符号可以用作变量值,甚至常量!
<?php define('EXAMPLE', symbol()); var_dump(is_symbol(EXAMPLE)); // expected output: true class Example { public const CLASS_CONST = EXAMPLE; } var_dump(is_symbol(Example::CLASS_CONST)); // expected output: true
序列化
但不能序列化
<?php serialize(symbol()); // Error
类型比较
请注意,符号既不是字符串,也不是数字,也不是其他任何东西(几乎是:3)。
<?php var_dump(is_string(symbol())); // expected output: false var_dump(is_int(symbol())); // expected output: false var_dump(is_float(symbol())); // expected output: false var_dump(is_bool(symbol())); // expected output: false var_dump(is_array(symbol())); // expected output: false var_dump(is_object(symbol())); // expected output: false var_dump(is_null(symbol())); // expected output: false var_dump(is_symbol(symbol())); // expected output: true var_dump(is_resource(symbol())); // expected output: true
克隆
请注意,符号始终按引用传递,不允许克隆。
<?php $a = symbol(); $b = $a; var_dump($a === $b); // expected output: true var_dump(clone $a); // Error
命名
要获取符号的名称,只需使用 Symbol::key()
方法
<?php use Fun\Symbol\Symbol; var_dump(Symbol::key(symbol('hello'))); // expected output: "hello" var_dump(Symbol::key(symbol('hello')) === Symbol::key(symbol('hello'))); // expected output: true var_dump(symbol('hello') === symbol('hello')); // expected output: false
反射
您可以找到有关此类型的一些详细信息
<?php use Fun\Symbol\Symbol; $reflection = Symbol::getReflection(Symbol::create('hello')); $reflection->getName(); // Contains "hello" string $reflection->getFileName(); // Provides path/to/file-with-symbol-definition.php $reflection->getStartLine(); // Provides definition line // etc...
全局符号
除此之外,您还可以使用 Symbol::for
方法创建全局符号。当使用 Symbol::for($key)
方法时,它会在给定的键的运行时符号注册表中搜索现有符号,如果找到则返回它。否则,将使用此键在全局符号注册表中创建一个新的符号。
<?php use Fun\Symbol\Symbol; var_dump(Symbol::for('a') === Symbol::for('a')); // expected output: true var_dump(Symbol::create('a') === Symbol::for('a')); // expected output: false
并且方法 Symbol::keyFor($symbol)
返回全局符号的名称。
<?php var_dump(Symbol::keyFor(Symbol::for('a'))); // expected output: "a" var_dump(Symbol::keyFor(Symbol::create('a'))); // expected output: null