在PHP中,可以使用一些第三方库或框架来实现类似于预定义注解的功能。例如”AllowDynamicProperties”、”ReturnTypeWillChange”和”SensitiveParameter”类,本教程将详细介绍这三个类。
一、AllowDynamicProperties
用于标记 class,允许动态属性。动态属性是指在运行时可以动态添加和访问的属性,而不是在类定义时静态声明的属性。
final class AllowDynamicProperties { /* 方法 */ public __construct() }
示例:
从 PHP 8.2.0 起弃用动态属性,因此在不使用此注解标记类的情况下使用动态属性将发出弃用通知。
<?php class DefaultBehaviour { } #[\AllowDynamicProperties] class ClassAllowsDynamicProperties { } $o1 = new DefaultBehaviour(); $o2 = new ClassAllowsDynamicProperties(); $o1->nonExistingProp = true; $o2->nonExistingProp = true; ?>
以上示例在 PHP 8.2 中的输出:
Deprecated: Creation of dynamic property DefaultBehaviour::$nonExistingProp is deprecated in file on line 10
二、ReturnTypeWillChange
大多数非 final 内部方法现在需要重写方法来声明兼容的返回类型,否则在继承验证期间会发出弃用通知。 如果由于 PHP 跨版本兼容性问题而无法为重写方法声明返回类型,可以添加 #[\ReturnTypeWillChange] 属性以消除弃用通知。
final class ReturnTypeWillChange { /* 方法 */ public __construct() }
三、SensitiveParameter
SensitiveParameter类用于标记敏感参数,如果出现在栈跟踪中,则应编辑其值。这种注解通常用于安全性相关的代码,比如处理用户输入、密码等敏感信息的函数或方法。
final class SensitiveParameter { /* 方法 */ public __construct() }
示例:
<?php function defaultBehavior( string $secret, string $normal ) { throw new Exception('Error!'); } function sensitiveParametersWithAttribute( #[\SensitiveParameter] string $secret, string $normal ) { throw new Exception('Error!'); } try { defaultBehavior('password', 'normal'); } catch (Exception $e) { echo $e, PHP_EOL, PHP_EOL; } try { sensitiveParametersWithAttribute('password', 'normal'); } catch (Exception $e) { echo $e, PHP_EOL, PHP_EOL; } ?>
上述示例在 PHP 8.2 中的输出类似于:
Exception: Error! in example.php:7 Stack trace: #0 example.php(19): defaultBehavior('password', 'normal') #1 {main} Exception: Error! in example.php:15 Stack trace: #0 example.php(25): sensitiveParametersWithAttribute(Object(SensitiveParameterValue), 'normal') #1 {main}