PHP 8.3 弃用 - 不带参数的 get_class 和get_parent_class 函数调用

作者: 温新

图书: 【PHP 8.3 新特性】

阅读: 608

时间: 2024-11-21 06:17:24

hi,我是温新

PHP 8.3 弃用了支持多个签名的函数和方法。历史上,这些函数最初接受一个函数签名,但后来更新为支持另一组参数,而无需声明新函数。

get_classget_parent_class 函数是支持两个签名的函数之一。

这两个函数都接受一个对象 $object 参数,返回类名或父类名(对于 get_parent_class 函数)。

<?php
// PHP 8.2.3
    
class MyClass {
}

class LogicException extends Exception {
}

$obj1 = new MyClass();
echo get_class($obj1) . PHP_EOL; // 输出 "MyClass"

$obj2 = new LogicException();
echo get_parent_class($obj2) . PHP_EOL; // 输出 "Exception"

然而,它也支持另一种签名,当没有传递参数时,它返回上下文中类的名称。

<?php
// PHP 8.2.3
    
class MyException extends InvalidArgumentException {
    public function __construct() {
        echo get_class(); // "MyException"
        echo get_parent_class(); // "InvalidArgumentException"
    }
}

new MyException;

在PHP 8.3中,调用不带参数的 get_classget_parent_class 函数已被弃用。上面的代码片段在 PHP 8.3 中发出弃用通知。替代的重载签名将在 PHP 9.0 中移除,除非传递了对象 $object 参数,否则会导致 ArgumentCountError 异常。

<?php
// PHP 8.3
    
class MyException extends InvalidArgumentException {
    public function __construct() {
        echo get_class(); // "MyException"
        echo get_parent_class(); // "InvalidArgumentException"
    }
}

new MyException;

Deprecated: Calling get_class() without arguments is deprecated

Deprecated: Calling get_parent_class() without arguments is deprecated

TIP

经过实际测试,PHP 8.3 中并没有提示弃用通知,而且输出结果是一样的。

时间:2023-12-8

get_class() 的替换

目前,get_class() 函数只能在类上下文中调用,已弃用的 get_class 调用可以用 self::class 或 CLASS 常量替换。self::class 魔术常量在 PHP 5.4 及更高版本中可用。CLASS 常量自 PHP 5.0 及更高版本起可用。

<?php

class Test {
    public function __construct()
    {
        // echo get_class();
        
        // 使用这种方法^S
        echo __CLASS__;
    }
}

new Test;

PHP 8.0及更高版本支持 $object::class

自 PHP 8.0 起,对象也支持 ::class 魔术常量。在PHP 8.0 应用程序中,可以将 get_class 调用安全地替换为 $object::class

<?php

class Test {
}

$test = new Test;
echo $test::class; // Test

get_parent_class 的替代

get_parent_class() 函数在没有参数的情况下返回的值与 parent::class 魔术常量相同。这样的函数调用可以用 parent::class 常量替换。

类似于 get_class 的替换,将 $this 传递给 get_parent_class() 也是有效的,但是这种行为并不等同于 get_parent_class,因为在没有父类的情况下使用 parent 会导致致命错误。

<?php

class BaseTest {
    public function __construct() {
        echo "BaseTest 构造函数被调用";
    }
}

class Test extends BaseTest {
    public function __construct() {
        echo get_parent_class($this); // BaseTest
    }
}

$test = new Test();
请登录后再评论