/
class_alias.php
60 lines (53 loc) 路 1.53 KB
/
class_alias.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
<?php
declare(strict_types=1);
namespace Psl\ObjectOriented;
use function class_alias as php_class_alias;
use function function_exists as php_function_exists;
/**
* Creates an alias for a class.
*
* Example:
*
* $class_name = Collection\Vector::class;
* $alias = 'AwesomeVector';
*
* ObjectOriented\class_alias($class_name, $alias);
* => Bool(true)
*
* $vector = new $alias(['a', 'b']);
*
* Type\object($class_name)->matches($vector);
* => Bool(true)
*
* @template T
*
* @param class-string<T> $class_name
*
* @psalm-assert-if-true class-string<T> $alias
*
* @return bool Returns false if unable to create an alias.
*/
function class_alias(string $class_name, string $alias): bool
{
// This is a weird scenario.
// assuming $alias is `Psl\Str\contains`
// attempting to call `class_exists` will result in the autoloader being triggered.
// trying to find the class `Psl\Str\contains`.
// this results composer autoloader including `src/Psl/Str/contains.php` again,
// which contains the function definition, leading to a fatal error due to
// redeclaration of the function.
//
// so we have to ensure we don't call `*_exists` function in this case.
if (!php_function_exists($alias)) {
if (class_exists($alias)) {
return false;
}
if (interface_exists($alias)) {
return false;
}
if (trait_exists($alias)) {
return false;
}
}
return php_class_alias($class_name, $alias);
}