我正在尝试使用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
不是指班级吗?
答案 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 是使用特征的类的名称。
示例:
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;
}
}
}