属性存在但property_exists()返回false;

Dan*_*old 8 php laravel laravel-5 php-7 laravel-5.4

好吧,我真的很困惑.当我检查属性是否存在时,它返回false.

if (property_exists($pais, 'id'))
// false
Run Code Online (Sandbox Code Playgroud)

但是当我调试它时,它就会显示出来.

print_r($pais->id);
// 1
print_r(property_exists($pais, 'id'));
// false
Run Code Online (Sandbox Code Playgroud)

我疯了还是我的神经元只是炒?

并且pais的创建是由

if (key_exists('country', $data))
    $pais = Pais::adicionarPais($data);

(...) 

public static function adicionarPais(array $data)
{
    return Pais::firstOrCreate(['nome' => $data['country']]);
}
Run Code Online (Sandbox Code Playgroud)

fed*_*sas 9

我看到你正在使用Laravel,所以我猜这是Eloquent模型.他们可能正在使用魔术方法从数据库列创建动态属性和方法.看看这里:http://php.net/manual/en/language.oop5.overloading.php

因此,每次您请求某个属性时,他们都会检查是否存在任何列或关系,而不是拥有真正的属性,而是返回该属性.

您可以使用该getAttributes()方法获取模型属性(https://github.com/illuminate/database/blob/master/Eloquent/Concerns/HasAttributes.php#L851)

class Pais
{
    public function __get($name) {
        if ($name == 'id') {
            return 1;
        }
    }
}
$pais = new Pais();
var_dump($pais->id); // int(1)
var_dump(property_exists($pais, 'id')); // bool(false)
Run Code Online (Sandbox Code Playgroud)


kjd*_*n84 6

您可以将模型转换为数组,然后使用array_key_exists. Eloquent 对象属性是通过魔术方法设置的,因此property_exists将不起作用,特别是如果该属性确实存在但设置为null.

例子:

$pais = Pais::find(1);

if (array_key_exists('country', $pais->toArray())) {
    // do stuff
}
Run Code Online (Sandbox Code Playgroud)

注意toArray模型上的使用。