簡體   English   中英

在PHP中避免使用null時,可以重新實現isset嗎?

[英]When avoiding nulls in PHP, can I reimplement isset?

我遇到一個我認為每個人都遇到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似乎不是正常的功能。 如果未定義屬性或類似屬性,它將以某種方式抑制警告,所以我不確定如何自己實現此類屬性。

就個人而言,我不會更改模型。 該模型應表示數據庫中的數據,其屬性值應與這些屬性所代表的列的值相同。

我將研究如何更改模型獲取數據的方式。 聽起來您正在從表單數據實例化模型,該數據不包含每個屬性的值,因為表單僅更新某些屬性。

如果通過從數據庫中選擇模型來實例化模型,然后在驗證和保存模型之前用表單數據對其進行修改,則該模型將具有每個屬性的正確值,並且null無疑表示null。

過去我想到的一件事是兩個論點的兩次通過。 第一個參數是對象本身。 第二個參數是包含屬性名稱的字符串。

這是一個例子:

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

這是您將如何使用它:

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

由於傳入對象時未引用該對象的屬性,因此PHP不會引發錯誤。 在函數的主體中,您可以使用傳入的字符串參數來引用屬性。 您可以使用PHP的一項特殊功能(稱為變量變量)來引用該屬性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM