-
-
Notifications
You must be signed in to change notification settings - Fork 282
/
reflection.texy
134 lines (82 loc) · 4.49 KB
/
reflection.texy
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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
PHP Отражение
*************
.[perex]
[api:Nette\Utils\Reflection] это статический класс с полезными функциями для отражения PHP. Его цель - исправить недостатки родных классов и унифицировать поведение в разных версиях PHP.
Установка:
```shell
composer require nette/utils
```
Во всех примерах предполагается, что псевдоним уже создан:
```php
use Nette\Utils\Reflection;
```
areCommentsAvailable(): bool .[method]
--------------------------------------
Определите, имеет ли reflection доступ к комментариям PHPdoc. Комментарии могут быть недоступны из-за кэша опкодов, см. например, директиву [opcache.save-comments |https://www.php.net/manual/en/opcache.configuration.php#ini.opcache.save-comments].
expandClassName(string $name, ReflectionClass $context): string .[method]
-------------------------------------------------------------------------
Расширяет имя класса `$name` до его полного имени в контексте класса `$context`, то есть в контексте его пространства имен и определенных псевдонимов. Таким образом, здесь фактически говорится о том, как парсер PHP `$name` понял бы , если бы он был написан в теле класса `$context`.
```php
namespace Foo;
use Bar;
class DemoClass
{
// new Bar, new Baz
}
$context = new ReflectionClass(Foo\DemoClass::class);
Reflection::expandClassName('Bar', $context); // 'Bar'
Reflection::expandClassName('Baz', $context); // 'Foo\Baz'
```
getMethodDeclaringMethod(ReflectionMethod $method): ReflectionMethod .[method]
------------------------------------------------------------------------------
Возвращает отражение метода, содержащее объявление метода `$method`. Обычно каждый метод является собственным объявлением, но тело метода может находиться в трейте и под другим именем.
Поскольку PHP не предоставляет достаточной информации для определения фактического объявления, Nette использует свою собственную эвристику, которая **должна** быть надежной.
```php
trait DemoTrait
{
function foo()
{
}
}
class DemoClass
{
use DemoTrait {
DemoTrait::foo as foo2;
}
}
$method = new ReflectionMethod('DemoClass::foo2');
Reflection::getMethodDeclaringMethod($method); // ReflectionMethod('DemoTrait::foo')
```
getPropertyDeclaringClass(ReflectionProperty $prop): ReflectionClass .[method]
------------------------------------------------------------------------------
Возвращает отражение класса или трейта, который содержит объявление свойства `$prop`. Свойство может быть объявлено в трейте.
Поскольку PHP не предоставляет достаточной информации для определения фактического объявления, Nette использует свою собственную эвристику, которая **не** надежна.
```php
trait DemoTrait
{
public $foo;
}
class DemoClass
{
use DemoTrait;
}
$prop = new ReflectionProperty(DemoClass::class, 'foo');
Reflection::getPropertyDeclaringClass($prop); // ReflectionClass('DemoTrait')
```
/--comment
\--
toString($reflection): string .[method]
---------------------------------------
Преобразует отражение в понятную человеку строку.
```php
$func = new ReflectionFunction('func');
echo Reflection::toString($func); // 'func()'
$class = new ReflectionClass('DemoClass');
echo Reflection::toString($class); // 'DemoClass'
$method = new ReflectionMethod('DemoClass', 'foo');
echo Reflection::toString($method); // 'DemoClass::foo()'
$param = new ReflectionParameter(['DemoClass', 'foo'], 'param');
echo Reflection::toString($param); // '$param in DemoClass::foo()'
$prop = new ReflectionProperty('DemoClass', 'foo');
echo Reflection::toString($prop); // 'DemoClass::$foo'
```