注意:使用未定义的常量自我假设'self',当将property_exists作为第一个参数放入时

时间:2013-08-23 15:36:18

标签: php oop properties constants self

我正在尝试使用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;
}

但是当我运行这个脚本时会出错:

  

注意:使用未定义的常量自我假设'self'   第36行/var/www/photo_gallery/includes/User.php

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

当我将自己更改为User(班级名称)时。它完美地运作。

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

2 个答案:

答案 0 :(得分:4)

使用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 也适用于特征。在特征方法中使用时, CLASS 是使用特征的类的名称。

PHP Manual

示例:

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

$test = new Test();

<强>输出:

Test

答案 1 :(得分:1)

您可以使用self::class这样避免魔术常数。

此外,您可以使用类似的方法从数组中创建实例:

public function __construct(array $array)
{
    foreach ($array as $key => $value) {
        if (property_exists(self::class, $key)) {
            $this->$key = $value;
        }
    }
}