![](/img/trans.png)
[英]Avoiding `Undefined Property` in PHP when using `isset()` in a callback?
[英]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.