PHP 8.3 弃用 - 不带参数的 get_class 和get_parent_class 函数调用
hi,我是温新
PHP 8.3 弃用了支持多个签名的函数和方法。历史上,这些函数最初接受一个函数签名,但后来更新为支持另一组参数,而无需声明新函数。
get_class
和 get_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_class
和 get_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();