7

我正在尝试使用self而不是在函数中键入类名propery_exists,如下所示:

private static function instantiate($record){
    $user = new self;
    foreach($record as $name => $value){
        if(isset($user->$name) || property_exists(self, $name)){
            $user->$name = $value;
        }
    }
    return $user;
}

但是当我运行这个脚本时,它得到一个错误:

注意:在第 36 行的 /var/www/photo_gallery/includes/User.php 中使用未定义的常量 self - 假定为 'self'

第 36 行property_exists是调用方法的行。

当我将自己更改为User(类名)时。它完美地工作。

我想知道为什么使用self会发出这样的通知?不是self指类吗?

4

2 回答 2

5

用于self引用当前类。不是类名

尝试使用魔法常数:

if(isset($user->$name) || property_exists(__CLASS__, $name)){

来自php手册:__CLASS__

类名。(在 PHP 4.3.0 中添加)从 PHP 5 开始,此常量返回声明的类名(区分大小写)。在 PHP 4 中,它的值总是小写的。类名包括它在其中声明的命名空间(例如 Foo\Bar)。请注意,从 PHP 5.4 开始,CLASS也适用于特征。在 trait 方法中使用时,CLASS是使用 trait 的类的名称。

PHP 手册

一个例子:

class Test {
    public function __construct(){
        echo __CLASS__;
    }
}

$test = new Test();

输出:

Test
于 2013-08-23T15:39:02.023 回答
1

您可以使用self::class这种方式来避免魔术常量。

作为补充,您可以使用这样的东西从数组中创建一个实例:

public function __construct(array $array)
{
    foreach ($array as $key => $value) {
        if (property_exists(self::class, $key)) {
            $this->$key = $value;
        }
    }
}
于 2020-08-14T16:27:41.650 回答