phpfn/symbol

符号类型实现

2.0.1 2020-08-09 02:40 UTC

This package is auto-updated.

Last update: 2024-09-23 06:23:04 UTC


README

Symbol 是一种特殊的原始数据类型,表示一个唯一的标识符。此 symbol 库实现类似于其他类型,例如

  1. JavaScript 中的符号: https://mdn.org.cn/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol
  2. Ruby 中的符号: https://doc.ruby-lang.org.cn/core-2.5.0/Symbol.html
  3. TypeScript 中的符号: https://typescript.net.cn/docs/handbook/symbols.html
  4. Erlang 中的原子: https://erlang.org.cn/doc/reference_manual/data_types.html#atom
  5. ...例如

安装

可以将库安装到任何 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