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

Posted

技术标签:

【中文标题】注意:使用未定义的常量自我假设 \'self\' ,当放入 property_exists 作为第一个参数时【英文标题】:Notice: Use of undefined constant self - assumed 'self' , When put in property_exists as the first argument注意:使用未定义的常量自我假设 'self' ,当放入 property_exists 作为第一个参数时 【发布时间】:2013-08-26 17:36:48 【问题描述】:

我正在尝试使用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 - 假定 'self' /var/www/photo_gallery/includes/User.php 在第 36 行

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

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

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

【问题讨论】:

【参考方案1】:

使用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 Manual

一个例子:

class Test 
    public function __construct()
        echo __CLASS__;
    


$test = new Test();

输出:

Test

【讨论】:

非常好。谢谢瓦希德。【参考方案2】:

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

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

public function __construct(array $array)

    foreach ($array as $key => $value) 
        if (property_exists(self::class, $key)) 
            $this->$key = $value;
        
    

【讨论】:

我更喜欢这种方法,使用 self::class 而不是当前类的魔法常数。

以上是关于注意:使用未定义的常量自我假设 'self' ,当放入 property_exists 作为第一个参数时的主要内容,如果未能解决你的问题,请参考以下文章

意外使用“自我”无限制全局变量

在 phpunit 中使用未定义的常量 LF

我应该总是为失败的初始化方法释放自我吗?

使用未定义的常量 CURLOPT_POST - 假定为“CURLOPT_POST”

什么是常量?Java中,常量的定义规则都有哪些?

在嵌套块中引用弱自我