php 如何检查对象属性是否显式设置为NULL

avwztpqn  于 2023-05-05  发布在  PHP
关注(0)|答案(3)|浏览(99)

假设我有这样一个简单的对象:

class User
{
  public id;
  public name;
  public surname;
  public gender;
  public age;
}

在我的代码中,我想根据设置的属性为这样的对象创建动态UPDATE语句。因此,我希望我的UPDATE(传输到数据库),并只更改已更改的列。如果用户的某个属性未设置,则该属性不应作为数据库列包含在UPDATE语句中。
例如,如果我创建User对象并仅设置idnamesurnameagegender保持未设置)

$User=new User();
$User->id=1;
$User->name='Bob';
$User->surname='Geldof';

从这个对象,我的代码应该像这样创建UPDATE语句:

UPDATE users SET name='Bob',surname='Geldof' WHERE id=1

问题是当数据库中的列可以有NULL值时(例如age)。在这种情况下,我应该能够在数据库中空此列。我应该检查User对象属性是否显式设置为NULL。如果它被设置为NULL,那么UPDATE语句的结果应该是:

UPDATE users SET name='Bob',age=NULL WHERE id=1

但是没有办法测试属性是否被设置为NULL值!
在这种情况下,我将属性设置为'NULL'字符串,并在代码中解析它,以便在创建UPDATE语句时将'NULL'字符串转换为NULL值。
是否可以区分对象属性是否显式设置为NULL值(而不是“NULL”字符串)?

eqqqjvef

eqqqjvef1#

我不知道我是不是漏掉了什么,但你要的答案似乎很简单。

class User {
    public $id = 1;
    public $name = NULL;
    public $age;
}

$user = new User();

$isset = [
    'id' => isset($user->id),
    'name' => isset($user->name),
    'age' => isset($user->age),
    'other' => isset($user->other)];
$isnul = [
    'id' => is_null($user->id),
    'name' => is_null($user->name),
    'age' => is_null($user->age),
    'other' => is_null($user->other)];
$isprp = [
    'id' => property_exists($user, 'id'),
    'name' => property_exists($user, 'name'),
    'age' => property_exists($user, 'age'),
    'other' => property_exists($user, 'other')];

var_dump($isset);
/*
array(3) {
  ["id"]=>
  bool(true)
  ["name"]=>
  bool(false)
  ["age"]=>
  bool(false)
  ["other"]=>
  bool(false)
}
*/       
var_dump($isnul);
/*
array(3) {
  ["id"]=>
  bool(false)
  ["name"]=>
  bool(true)
  ["age"]=>
  bool(true)
  ["other"]=>
  bool(true) // Also throws: "Notice:  Undefined property: User::$other"
}
*/
var_dump($isprp);
/*
array(3) {
  ["id"]=>
  bool(true)
  ["name"]=>
  bool(true)
  ["age"]=>
  bool(true)
  ["other"]=>
  bool(false)
}
*/

然而,关于你的文章的其余部分,这似乎毫无意义,因为你可能只是省略了你没有的值,并使用数据库的默认null选项(除非你的特定数据库出于某种原因不支持)。

x9ybnkn6

x9ybnkn62#

如果属性设置为NULL或未设置,isset()没有区别。
使用PHP函数property_exists($user,age)
参见:https://www.php.net/manual/en/function.property-exists.php

neekobn8

neekobn83#

你正在处理你的类声明的属性,所以答案是“否”。
当你声明类属性而没有像这里一样用默认值初始化它们时,PHP对待它们,在类的任何对象上,就像它们是用值NULL声明的一样。没有办法区分。
最简单的解决方案是在SQL UPDATE语句中包含所有属性,包括未更改的null。无论通过省略它们可以节省多少性能,都不值得每次都像这样手动构建查询。

相关问题