注意:使用未定义的常量自我假设 '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 作为第一个参数时的主要内容,如果未能解决你的问题,请参考以下文章