PHP 8.2动态属性已弃用:如何以兼容方式使用它们

qojgxg4l  于 2023-01-08  发布在  PHP
关注(0)|答案(1)|浏览(467)

在PHP 8.2中为Dynamic Properties are deprecated,从PHP 9开始将导致致命错误。
在运行PHP 8.2的 * 类 * 上使用 * 动态属性 * 将导致PHP Deprecated: Creation of dynamic property is deprecatedE_DEPRECATED警告。
现在,虽然在类中拥有公共/动态属性通常是一个糟糕的OO实践,* 但这个问题不是关于最佳OO实践,* 而是如何使使用动态属性的实际代码与PHP 8.2以上版本兼容。
如何使使用 * 动态属性 * 的实际代码基与新行为兼容?

oprakyz7

oprakyz71#

正如ADyson所建议的那样,解决方案是在 * 类定义 * 之上使用#[AllowDynamicProperties] * 属性 *。
标记为#[AllowDynamicProperties]的类及其子类可以继续使用动态属性,而不会被弃用或删除。
对于有意不具有固定属性集的类,可以实现magic __get()/__台()或使用#[AllowDynamicProperties]属性标记类。使用#[AllowDynamicProperties]标记类与早期的PHP版本完全向后兼容,因为在PHP 8.0之前,这将被解释为注解,并且使用不存在的类作为属性不是错误。
这是一个完整的示例,包含在我创建的this github repository中,用于在 TraitsExtended Classes 上测试此特性

<?php
namespace App\Classes;

/**
 * Use the fully-qualified AllowDynamicProperties, otherwise the #[AllowDynamicProperties] attribute on "MyClass" WILL NOT WORK.
 */
use \AllowDynamicProperties;

#[AllowDynamicProperties]
class MyClass
{
    /**
     * Dynamic attributes will work with no deprecation warnings
     */
    public function __construct()
    {
        $this->first_name = 'George';
        $this->last_name = 'Orwell';
    }
}

class MyExtendedClass extends MyClass 
{
    /**
     * Even if "MyExtendedClass" is not using #[AllowDynamicProperties], it extends "MyClass", that is using it.
     * Dynamic attributes will work with no deprecation warnings
     */
    public function __construct()
    {
        parent::__construct();
    }
}

相关问题