Nette Documentation Preview

syntax
PHP Reflection
**************

.[perex]
[api:Nette\Utils\Reflection] is a static class with useful functions for PHP reflection. Its purpose is to fix flaws in native classes and to unify behavior across different versions of PHP.

Installation:

```shell
composer require nette/utils
```

All examples assume the following class alias is defined:

```php
use Nette\Utils\Reflection;
```


areCommentsAvailable(): bool .[method]
--------------------------------------

Finds out if reflection has access to PHPdoc comments. Comments may not be available due to the opcode cache, see for example the directive [opcache.save-comments |https://www.php.net/manual/en/opcache.configuration.php#ini.opcache.save-comments].


expandClassName(string $name, ReflectionClass $context): string .[method]
-------------------------------------------------------------------------

Expands the `$name` of the class to full name in the context of the `$context`, ie in the context of its namespace and defined aliases. Thus, it returns how the PHP parser would understand `$name` if it were written in the body of the `$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]
------------------------------------------------------------------------------

Returns a reflection of a method that contains a declaration of `$method`. Usually, each method is its own declaration, but the body of the method can also be in the trait and under a different name.

Because PHP does not provide enough information to determine the actual declaration, Nette uses its own heuristics, which **should be** reliable.

```php
trait DemoTrait
{
	function foo()
	{
	}
}


class DemoClass
{
	use DemoTrait {
		DemoTrait::foo as foo2;
	}
}


$method = new ReflectionMethod('DemoClass::foo2');
Reflection::getMethodDeclaringMethod($method); // ReflectionMethod('DemoTrait::foo')
```


getParameterDefaultValue(ReflectionParameter $param) .[method]
--------------------------------------------------------------

Returns the default value of `$param` in a function or method. If it is a constant, it returns its value. If the parameter does not have a default value or the constant cannot be resolved, it throws `ReflectionException`.

```php
class DemoClass
{
	function foo($param = PDO::FETCH_BOTH)
	{
	}
}

$method = new ReflectionMethod('DemoClass::foo');
Reflection::getParameterDefaultValue($method->getParameters()[0]);
```


getParameterType(ReflectionParameter $param): ?string .[method]
---------------------------------------------------------------

Returns the type of `$param` in a function or method and normalizes `self` and `parent` to the actual class names. If the parameter does not have a type, it returns `null`.

```php
class DemoClass
{
	function foo(self $param)
	{
	}
}

$method = new ReflectionMethod('DemoClass::foo');
Reflection::getReturnType($method->getParameters()[0]); // 'DemoClass'
```


getPropertyDeclaringClass(ReflectionProperty $prop): ReflectionClass .[method]
------------------------------------------------------------------------------

Returns a reflection of a class or trait that contains a declaration of property `$prop`. Property can also be declared in the trait.

Because PHP does not provide enough information to determine the actual declaration, Nette uses its own heuristics, which **are not** reliable.

```php
trait DemoTrait
{
	public $foo;
}


class DemoClass
{
	use DemoTrait;
}

$prop = new ReflectionProperty(DemoClass::class, 'foo');
Reflection::getPropertyDeclaringClass($prop); // ReflectionClass('DemoTrait')
```


getReturnType(ReflectionFunctionAbstract $func): ?string .[method]
------------------------------------------------------------------

Returns the type of return value of function or method `$func` and normalizes `self`, `static`, and `parent` to actual class names. If the function does not have a return type, it returns `null`.

```php
class DemoClass
{
	function foo(): self
	{
	}
}

$method = new ReflectionMethod('DemoClass::foo');
Reflection::getReturnType($method); // 'DemoClass'
```


isBuiltinType(string $type): bool .[method]
-------------------------------------------

Determines if `$type` is PHP built-in type. Otherwise, it is the class name.

```php
Reflection::isBuiltinType('string'); // true
Reflection::isBuiltinType('Foo');    // false
```


toString($reflection): string .[method]
---------------------------------------

Converts a reflection to a string.

```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'
```

PHP Reflection

Nette\Utils\Reflection is a static class with useful functions for PHP reflection. Its purpose is to fix flaws in native classes and to unify behavior across different versions of PHP.

Installation:

composer require nette/utils

All examples assume the following class alias is defined:

use Nette\Utils\Reflection;

areCommentsAvailable(): bool

Finds out if reflection has access to PHPdoc comments. Comments may not be available due to the opcode cache, see for example the directive opcache.save-comments.

expandClassName(string $name, ReflectionClass $context)string

Expands the $name of the class to full name in the context of the $context, ie in the context of its namespace and defined aliases. Thus, it returns how the PHP parser would understand $name if it were written in the body of the $context.

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

Returns a reflection of a method that contains a declaration of $method. Usually, each method is its own declaration, but the body of the method can also be in the trait and under a different name.

Because PHP does not provide enough information to determine the actual declaration, Nette uses its own heuristics, which should be reliable.

trait DemoTrait
{
	function foo()
	{
	}
}


class DemoClass
{
	use DemoTrait {
		DemoTrait::foo as foo2;
	}
}


$method = new ReflectionMethod('DemoClass::foo2');
Reflection::getMethodDeclaringMethod($method); // ReflectionMethod('DemoTrait::foo')

getParameterDefaultValue(ReflectionParameter $param)

Returns the default value of $param in a function or method. If it is a constant, it returns its value. If the parameter does not have a default value or the constant cannot be resolved, it throws ReflectionException.

class DemoClass
{
	function foo($param = PDO::FETCH_BOTH)
	{
	}
}

$method = new ReflectionMethod('DemoClass::foo');
Reflection::getParameterDefaultValue($method->getParameters()[0]);

getParameterType(ReflectionParameter $param): ?string

Returns the type of $param in a function or method and normalizes self and parent to the actual class names. If the parameter does not have a type, it returns null.

class DemoClass
{
	function foo(self $param)
	{
	}
}

$method = new ReflectionMethod('DemoClass::foo');
Reflection::getReturnType($method->getParameters()[0]); // 'DemoClass'

getPropertyDeclaringClass(ReflectionProperty $prop): ReflectionClass

Returns a reflection of a class or trait that contains a declaration of property $prop. Property can also be declared in the trait.

Because PHP does not provide enough information to determine the actual declaration, Nette uses its own heuristics, which are not reliable.

trait DemoTrait
{
	public $foo;
}


class DemoClass
{
	use DemoTrait;
}

$prop = new ReflectionProperty(DemoClass::class, 'foo');
Reflection::getPropertyDeclaringClass($prop); // ReflectionClass('DemoTrait')

getReturnType(ReflectionFunctionAbstract $func): ?string

Returns the type of return value of function or method $func and normalizes self, static, and parent to actual class names. If the function does not have a return type, it returns null.

class DemoClass
{
	function foo(): self
	{
	}
}

$method = new ReflectionMethod('DemoClass::foo');
Reflection::getReturnType($method); // 'DemoClass'

isBuiltinType(string $type)bool

Determines if $type is PHP built-in type. Otherwise, it is the class name.

Reflection::isBuiltinType('string'); // true
Reflection::isBuiltinType('Foo');    // false

toString($reflection): string

Converts a reflection to a string.

$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'