Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 是否有更好的方法只访问和存储所需的类属性_Php_Class_Object_Properties_Mysqli - Fatal编程技术网

Php 是否有更好的方法只访问和存储所需的类属性

Php 是否有更好的方法只访问和存储所需的类属性,php,class,object,properties,mysqli,Php,Class,Object,Properties,Mysqli,如果我想从数据库中获取客户的电子邮件地址,以下是错误的,因为$row将包含customer表中每个字段的元素: $result = mysqli_query ('SELECT * FROM customer WHERE custid = 1'); $row = mysqli_fetch_array ($result, MYSQLI_ASSOC); 这被认为更好,因为$row将包含电子邮件地址的单个元素,这就是我们所需要的: $result = mysqli_query ('SELECT ema

如果我想从数据库中获取客户的电子邮件地址,以下是错误的,因为$row将包含
customer
表中每个字段的元素:

$result = mysqli_query ('SELECT * FROM customer WHERE custid = 1');
$row = mysqli_fetch_array ($result, MYSQLI_ASSOC);
这被认为更好,因为$row将包含电子邮件地址的单个元素,这就是我们所需要的:

$result = mysqli_query ('SELECT email FROM customer WHERE custid = 1');
$row = mysqli_fetch_array ($result, MYSQLI_ASSOC);
我试图将同样的逻辑应用于对象。如果一个“客户”对象有50个属性/字段,那么当您只需要访问一个属性时,填充所有50个属性是否很常见

下面是一个客户类和对象的基本示例,如果我们只想获取客户的电子邮件地址,而不是他们的所有其他详细信息,那么这个客户类和对象就需要大量资源(在这个示例中,“客户”对象有5个属性,但实际上可能还有更多属性):


您可以创建获取电子邮件地址的方法:

public function getCustomerEmail ($id) {
    $result = mysql_queryi ('SELECT email FROM customer WHERE custid = ' . (int)$id);
    $row = mysqli_fetch_array ($result, MYSQLI_ASSOC);
    foreach ($row as $key => $value) {
        if (isset ($this->$key)) {
            $this->$key = $value;
        }
    }
}

PS:在查询中使用变量之前,不要忘记清理变量

您可以创建一个获取电子邮件地址的方法:

public function getCustomerEmail ($id) {
    $result = mysql_queryi ('SELECT email FROM customer WHERE custid = ' . (int)$id);
    $row = mysqli_fetch_array ($result, MYSQLI_ASSOC);
    foreach ($row as $key => $value) {
        if (isset ($this->$key)) {
            $this->$key = $value;
        }
    }
}

PS:在查询中使用变量之前,不要忘记清理变量

您可以为接受要查询的字段数组的
getCustomer
函数创建第二个参数

public function getCustomer ($id, $fields=array('*')) {
    $fields = implode(',', $fields);
    $result = mysql_queryi("SELECT {$fields} FROM customer WHERE ...");
    // ...
用法


奖金: 我建议您在模型中以稍微不同的方式存储字段

class Customer
    private $_data;

    public function getCustomer($id, $fields=array('*')) {
        // ...
    }

    // PHP magic set method
    // calling $this->foo = 'bar' results in $this->_data['foo'] = 'bar'
    public function __set($key, $value) {
        return $this->_data[$key] = $value;
    }

    // PHP magic get method
    // calling $this->foo results in $this->_data['foo']
    public function __get($key) {
        return array_key_exists($key, $this->_data)
            ? $this->_data[$key]
            : null
        ;
    }
}
这样你就可以摆脱所有静态定义的实例变量;e、 例如,
private$custid
私有$firstname
private…

相反,所有字段都将存储在
$this->\u data
专用关联数组中

这样做的好处是,您甚至不必更改
getCustomer
函数的编写方式


您可以为接受要查询的字段数组的
getCustomer
函数提供第二个参数

public function getCustomer ($id, $fields=array('*')) {
    $fields = implode(',', $fields);
    $result = mysql_queryi("SELECT {$fields} FROM customer WHERE ...");
    // ...
用法


奖金: 我建议您在模型中以稍微不同的方式存储字段

class Customer
    private $_data;

    public function getCustomer($id, $fields=array('*')) {
        // ...
    }

    // PHP magic set method
    // calling $this->foo = 'bar' results in $this->_data['foo'] = 'bar'
    public function __set($key, $value) {
        return $this->_data[$key] = $value;
    }

    // PHP magic get method
    // calling $this->foo results in $this->_data['foo']
    public function __get($key) {
        return array_key_exists($key, $this->_data)
            ? $this->_data[$key]
            : null
        ;
    }
}
这样你就可以摆脱所有静态定义的实例变量;e、 例如,
private$custid
私有$firstname
private…

相反,所有字段都将存储在
$this->\u data
专用关联数组中

这样做的好处是,您甚至不必更改
getCustomer
函数的编写方式

首先…
您确实应该将获取客户对象的逻辑与实际对象分离。。。我建议查看存储库/外观模式以获取示例

例如,CustomerCollectionInstance->getCustomer($id)返回一个客户实体。

您的示例非常简单,因此仅提取电子邮件和所有这些字段的区别应该是微不足道的。如果你的物品很大,比如一位可能有500份订单的客户。订单应该被分成各自的对象,当实体对象被组装时,这些重的对象不应该被加载,而是在它们的位置上有代理对象,当被访问时,然后查询数据库中的数据



例如

  • 您在CustomerCollection上调用getCustomer

  • CustomerCollection返回已加载基本数据的CustomerEntity,customerOrders使用CustomerOrderCollectionProxy对象进行设置。

  • 调用CustomerEntity->getOrders(),返回CustomerOrderCollectionProxy对象

  • 调用CustomerOrderCollectionProxy后,它将首先检查是否已从数据库加载所需的数据。。。如果没有,它将组装一个真正的CustomerOrderCollection,并将所有调用委托给现在具有所需日期的对象



有关示例,请参见代理模式。

首先…
您确实应该将获取客户对象的逻辑与实际对象分离。。。我建议查看存储库/外观模式以获取示例

例如,CustomerCollectionInstance->getCustomer($id)返回一个客户实体。

您的示例非常简单,因此仅提取电子邮件和所有这些字段的区别应该是微不足道的。如果你的物品很大,比如一位可能有500份订单的客户。订单应该被分成各自的对象,当实体对象被组装时,这些重的对象不应该被加载,而是在它们的位置上有代理对象,当被访问时,然后查询数据库中的数据



例如

  • 您在CustomerCollection上调用getCustomer

  • CustomerCollection返回已加载基本数据的CustomerEntity,customerOrders使用CustomerOrderCollectionProxy对象进行设置。

  • 调用CustomerEntity->getOrders(),返回CustomerOrderCollectionProxy对象

  • 调用CustomerOrderCollectionProxy后,它将首先检查是否已从数据库加载所需的数据。。。如果没有,它将组装一个真正的CustomerOrderCollection,并将所有调用委托给现在具有所需日期的对象




以代理模式为例。

固态PS,这是一个等待发生的噩梦hahaYes-尽管我更愿意将其转换为函数外部(int)而不是内部。但是在字符串的情况下,你肯定想逃避它们。固态PS,这是一个等待发生的噩梦哈哈-尽管我更喜欢将它转换到函数外部(int)而不是内部。但在字符串的情况下,您肯定希望避开它们。