代码之家  ›  专栏  ›  技术社区  ›  DMJ

在PHP中避免空值时,我可以重新实现isset吗?

  •  2
  • DMJ  · 技术社区  · 6 年前

    我遇到了一个问题,我认为每个人都会遇到null:也就是说,有不同类型的null。它可能意味着“空”、“不变”、“未设置”、“未知”或任何数量的事物。我已经到了需要以某种方式区分它们的地步。

    基本上,我的程序中有一个数据库管理器部分,它从负责验证表单数据并将其转换为所述对象(具有特定预定义属性的几个不同类中的一个)的程序的另一部分接收表示要在数据库中更新的数据的对象。我需要一些方法来区分对象中的“null”属性,这意味着“我实际上希望在数据库中存储null值”,以及不同类型的“null”,这意味着“如果数据库中存在现有值,请不要更改它”。在这两种情况中,后者将是更常见的情况,但我需要一些方法来考虑前者。

    我目前的想法是创建一个新类来表示null的每个“类型”,例如 Unchanged 班级诗a SetToNull

    isset() 函数,它允许我在一个简单语句中检查给定属性是否存在,以及它是否有实值(与我的一个新空类型相反)。

    我知道我可以这样做:

    if (isset($thing->property) && !($thing->property instanceof Unchanged || $thing->property instanceof SetToNull)){
        // do whatever
    }
    

    然而,这显然不是理想的,因为它很长而且很难处理,我不想让它遍布我的代码库。我更喜欢这样的:

    if (myCustomIsset($thing->property)){
        // do whatever
    }
    

    isset 似乎不是一个正常的函数;如果没有定义属性或类似的东西,它会以某种方式抑制警告,因此我不确定自己如何实现类似的东西。

    1 回复  |  直到 6 年前
        1
  •  3
  •   Cave Johnson    6 年前

    我在过去做过的一件事是两次争论中的两次传递。第一个参数是对象本身。第二个参数是包含属性名称的字符串。

    以下是一个例子:

    function MyCustomIsset($object, $property) {
        return isset($object->$property) && !($object->$property instanceof Unchanged || $object->$property instanceof SetToNull);
    }
    

    下面是您将如何使用它:

    if (myCustomIsset($thing, "property")){
        // do whatever
    }
    

    因为传入对象时没有引用对象的属性,所以PHP不会抛出错误。在函数体中,使用传入的字符串参数引用属性。您可以使用PHP的一个名为 variable variables .

        2
  •  4
  •   Don't Panic    6 年前

    我将考虑改变模型获取数据的方式。听起来像是从表单数据实例化模型,表单数据不包括每个属性的值,因为表单只更新某些属性。

    如果您通过从数据库中选择模型来实例化模型,然后在验证和保存之前使用表单数据对其进行修改,则每个属性的值都将正确,null将明确表示null。