PHP检查属性是否存在 - 始终返回false

时间:2017-08-03 10:07:37

标签: php

我有以下抽象类Types

abstract class DocumentTypes {
    const OPERATIONAL = 1; 
}

这与存储在表中的值有关。记录必须有一个类型,这是传递下来。因此,例如,如果有人输入了OPERATIONAL部分的内容,那么这将是输入数据库的类型。

我有一个处理这个问题的函数:

function handle($data, $type)
{
    if(!property_exists($type, DocumentTypes::class))
    {
        throw new Exception("Property value must exist");   
    }
}

现在我要做的是确保传递给handle的属性是抽象类Types内属性OPERATIONAL的属性,但是,当我尝试执行以下操作时:

$data = "asasfasfasfafs"; 

try {

    handle($data, DocumentTypes::OPERATIONAL); 

}catch(Exception $e)
{
    die($e); 
}

我收到以下异常:

  
    

第一个参数必须是对象或

中现有类的名称   

因此,我如何检查传递的值实际上是Types类的属性?

2 个答案:

答案 0 :(得分:2)

您只需要切换参数顺序。类名必须是第一个:

if(!property_exists(DocumentTypes::class $type))
    ...

检查documentation here

虽然传递给property_exists的第二个参数必须是一个字符串,这是您正在寻找的属性的名称。因此,如果您正在寻找1 ...

,它仍然无法工作

<强>更新 在阅读了你的一些评论之后,我想我明白你现在正在尝试做些什么。您希望确保用户正在传递有效类型,并且有效类型被定义为单独的常量。

这是我总能解决这个问题的方法:

abstract class DocumentTypes {
    const OPERATIONAL = 1;
    const OTHER_TYPE = 2;

    public static function validTypes()
    {
        return [
            DocumentTypes::OPERATIONAL,
            DocumentTypes::OTHER_TYPE,
        ];

    }
}

然后,您可以使用validTypes功能验证$type

public function handle($type)
{
    if (!in_array($type, DocumentTypes::validTypes(), true)) {
        throw new Exception("Property value must exist");
    }
}

答案 1 :(得分:1)

首先,类的属性与类的常量不同。 所以函数A21不适合你。

要检查,如果类型(存在cosnstat),则必须使用B15函数

中学 - 我不明白你真正需要什么。你需要检查 - 是否有一个常量定义,哪个值与输入值匹配?

如果是 - 那么你不能这样做。

property_exists()