serafim/symbol

该软件包已被废弃,不再维护。作者建议使用 https://github.com/phpfn/symbol 软件包。

Symbol 类型 PHP 实现

1.0.0 2019-07-04 18:12 UTC

This package is auto-updated.

Last update: 2020-08-08 23:37:31 UTC


README

Symbol

Travis CI 68747470733a2f2f6170692e636f6465636c696d6174652e636f6d2f76312f6261646765732f34336639316563323734303730383162386435312f746573745f636f766572616765 68747470733a2f2f6170692e636f6465636c696d6174652e636f6d2f76312f6261646765732f34336639316563323734303730383162386435312f6d61696e7461696e6162696c697479

PHP 7.1+ Latest Stable Version Total Downloads License MIT

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. ...例如。

使用方法

为了创建新的符号数据类型,您应该使用 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