我有以下抽象类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
类的属性?
答案 0 :(得分:2)
您只需要切换参数顺序。类名必须是第一个:
if(!property_exists(DocumentTypes::class $type))
...
虽然传递给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()