serafim / symbol
1.0.0
2019-07-04 18:12 UTC
Requires
- php: >=7.1.3
Requires (Dev)
- phpunit/phpunit: ~7.5
This package is auto-updated.
Last update: 2020-08-08 23:37:31 UTC
README
Symbol
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
- ...例如。
使用方法
为了创建新的符号数据类型,您应该使用 Symbol::create()
方法或调用全局辅助函数 symbol()
。
<?php $a = symbol(); // OR $b = \Serafim\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 Serafim\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 Serafim\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 Serafim\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