初始化对象的最快方法 - PHP性能

时间:2015-11-18 22:22:59

标签: php

我有一个包含大约30个设置的对象。 1页可以包含10个对象,每个对象最多15个设置。 为了初始化对象,我从数据库中为每个对象获取一个关联数组。 我想知道什么是最好的表现?我目前有(例子):

$object = new element_class();
$array = <query from database>
//Reinitialize object to remove any set values of object properties to null
foreach($object as $key=>$value)
{
    $object->$key = null;
}

//Switch of array to set the values in the array in the object properties
foreach($array as $key=>$value)
{
    switch($key)
    {
        case 'a':
         $this->property_a = $value;
         break;
        case 'b':
         $this->property_b = $value;
         break;
        case 'c':
         $this->property_c = $value;
         break;
        case 'd':
         $this->property_d = $value;
         break;
         etc....
    }
}

//Default section to set necessary properties if not in database array
foreach($object as $key=>$value)
{
     if($value == null)
     {
            switch ($key)
            {
                case 'property_a':
                     $object->$key = <any value here>;
                     break;
                case 'property_b':
                     $object->$key = <any value here>;
                     break;
                case 'property_c':
                     $object->$key = <any value here>;
                     break;
               etc.....
            }   
     }
}

这3个步骤有更快的方法吗? 任何性能提升都是受欢迎的,特别是因为它有很多......

很抱歉,如果脚本中有错误,我从头开始输入,我没有代码atm

2 个答案:

答案 0 :(得分:2)

代替switch,您可以使用变量属性,假设属性名称和关联数组的键之间存在一致的模式。

$this->{"property_" . $key} = $value;

另一种选择是将所有设置存储在包含关联数组的单个属性中。然后你可以这样做:

$this->settings = $array;

答案 1 :(得分:2)

$object = new element_class();

//Reinitialize object to remove any set values of object properties to null
foreach($object as $key=>$value)
    $object->$key = null;

可以替换为

$object = new element_class();

假设您定义public $field s,默认情况下初始化为null

$array = <query from database>
//Switch of array to set the values in the array in the object properties
foreach($array as $key=>$value)
{
    switch($key)
    {
        case 'a':
         $this->property_a = $value;
         break;
        case 'b':
         $this->property_b = $value;
         break;
        case 'c':
         $this->property_c = $value;
         break;
        case 'd':
         $this->property_d = $value;
         break;
         etc....
    }
}

可以替换为

$settings = (object) $array;

它将设置与$this分开,因此您可以轻松保存它们。

//Default section to set necessary properties if not in database array
foreach($object as $key=>$value)
     if($value == null)
            switch ($key)
            {
                case 'property_a':
                     $object->$key = <any value here>;
                     break;
                case 'property_b':
                     $object->$key = <any value here>;
                     break;
                case 'property_c':
                     $object->$key = <any value here>;
                     break;
               etc.....
            }   

应该由element_class()构造函数完成,如下所示:

class element_class {
    public $a = <any value here>;
    public $b = <any value here>;
    ....
}

然后你消除null循环(或者用设置默认值代替它),你所要做的就是用<query>提取的值覆盖它们。

这是使用php的原生array_merge

的一种方式
$defaults = [
  'a' => <any value here>,
  'b' => <any value here>,
  ...
];
$array = <query>;
$settings = (object) array_merge( $defaults, $array );

我不知道它是否更快,但它更容易维护。 如果存在任何速度问题,则应该使用 SQL查询数。你说你有&#34; 10&#34; 对象,每个对象都有&#34; 15 &#34;行。通过使 1 查询返回 150 对象,您可以获得更高的速度增益。