我遇到了一个问题,我认为每个人都会遇到null:也就是说,存在不同类型的null。它可能表示“空”,“不变”,“未设置”,“未知”或任何其他形式。我到了需要以某种方式区分它们的地步。
基本上,我程序的数据库管理器部分从负责验证表单数据并将其转换为所述对象的程序的另一部分接收一个对象,该对象表示要在数据库中更新的数据。具有特定预定义属性的几个不同类)。我需要某种方法来区分该对象中的“ null”属性,即“我实际上希望将值null存储在数据库中”和另一种类型的“ null”,这意味着“如果数据库中存在现有值,不能改变”。在这两者中,后者将是最常见的情况,但我也需要某种方式允许前者。
我目前的想法(对于这种情况似乎是最好的)是创建一个新的类,该类代表每种null的“类型”,例如Unchanged
类与SetToNull
类型的对比像那样。然后,我可以将属性设置为这些类之一的实例。
唯一的问题是我想要一个功能类似于现有isset()
函数的函数,因为它可以让我检查给定属性是否存在以及是否具有真实值(相对到一个简单的语句中)。
我知道我可以做这样的事情:
if (isset($thing->property) && !($thing->property instanceof Unchanged || $thing->property instanceof SetToNull)){
// do whatever
}
但是,这显然并不理想,因为它又长又笨拙,而且我不想在我的代码库中到处都有它。我更喜欢这样的东西:
if (myCustomIsset($thing->property)){
// do whatever
}
但是,isset
似乎不是正常功能;如果未定义该属性或类似属性,它将以某种方式抑制警告,所以我不确定如何自己实现该属性。
答案 0 :(得分:4)
我个人不会更改模型。该模型应表示数据库中的数据,其属性值应与这些属性所表示的列的值相同。
我将研究如何更改模型获取数据的方式。听起来好像您是从表单数据实例化模型,该模型不包含每个属性的值,因为表单仅更新某些属性。
如果您通过从数据库中选择模型来实例化模型,然后在验证和保存模型之前用表单数据对其进行修改,则该模型将具有每个属性的正确值,并且null无疑表示null。
答案 1 :(得分:3)
我过去想到的一件事是两次传入两个参数。第一个参数是对象本身。第二个参数是包含属性名称的字符串。
这里是一个例子:
function MyCustomIsset($object, $property) {
return isset($object->$property) && !($object->$property instanceof Unchanged || $object->$property instanceof SetToNull);
}
这是您将如何使用它:
if (myCustomIsset($thing, "property")){
// do whatever
}
由于传入对象时未引用该对象的属性,因此PHP不会引发错误。在函数的主体中,您可以使用传入的字符串参数来引用属性。您可以使用称为variable variables的PHP的特殊功能来引用该属性。