Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/232.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.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_Variables_For Loop_Creation - Fatal编程技术网

额外的变量或对象创建——PHP中有什么更好?

额外的变量或对象创建——PHP中有什么更好?,php,variables,for-loop,creation,Php,Variables,For Loop,Creation,PHP中什么更好/更快/更高效 使用额外变量: $dateStep = new DateInterval('P1D'); for($di = 0; $di <= $dateInterval; ++$di) { $theDate = ($di > 0) ? $startDate->add($dateStep) : $startDate; ... } $dateStep=newdateinterval('P1D'); 对于($di=0;$di 0)$start

PHP中什么更好/更快/更高效

使用额外变量:

$dateStep = new DateInterval('P1D');

for($di = 0; $di <= $dateInterval; ++$di)
{
    $theDate = ($di > 0) ? $startDate->add($dateStep) : $startDate;

    ...
}
$dateStep=newdateinterval('P1D');
对于($di=0;$di 0)$startDate->add($dateStep):$startDate;
...
}
或在每次需要时创建对象:

for($di = 0; $di <= $dateInterval; ++$di)
{
    $theDate = ($di > 0) ? $startDate->add(new DateInterval('P1D')) : $startDate;

    ...
}
($di=0;$di 0)的
$startDate->add(新日期间隔('P1D')):$startDate;
...
}
我会投票支持第一种选择,但我在PHP优化和性能方面的知识非常有限


编辑:我似乎没有充分表达这一点,但我特别要求这样一个场景——当对象的创建返回静态值时,它会在下面的循环中反复使用。

第一个肯定更快。
N类实例比1个变量声明更昂贵。

我将使用以下内容

$dateStep = new DateInterval('P1D');

for($di = 0; $di > $dateInterval; ++$di)
{
    $theDate = ($di > 0) $startDate->add($dateStep);

    ...
}

除非确有必要,否则不建议在循环中反复创建对象。在上述情况下,在循环之前创建and对象,并传递该对象以节省时间(用于创建另一个对象)和空间(通过不在内存中创建另一个对象)。

这两个版本在逻辑上是不同的。

第一个版本多次传递同一对象引用。这意味着,如果在循环后更改
$dateStep
,则会更改所有引用

第二个版本在每次调用该方法时将引用应用于单个对象



在使用
DateTime::add()
方法的示例中,
$dateStep
可以看作是一个不变的常量值。在这种情况下,第一个版本更快和更好,因为它不需要每次调用构造函数,因为它只需要创建一次,它就需要更少的内存。

< P>从另一个角度来看这个问题,让我们来看看脚本和操作码:

脚本1:

<?php

$dateStep = new DateInterval('P1D');
$dateInterval = 5;
$startDate = new DateTime();

for($di = 0; $di <= $dateInterval; ++$di)
{
    $theDate = ($di > 0) ? $startDate->add($dateStep) : $startDate;

    //...
}
脚本2:

<?php


$dateInterval = 5;
$startDate = new DateTime();

for($di = 0; $di <= $dateInterval; ++$di)
{
    $theDate = ($di > 0) ? $startDate->add(new DateInterval('P1D')) : $startDate;

   // ...
}
现在,正如您在第二个脚本的操作码中所看到的,它在每次迭代中都会创建一个新的类实例,并且您会创建一个巨大的开销,这似乎是您不需要的(请参阅第二个操作码中的
#*13-16
),因此,首先您要创建完全不必要的新实例,其次这会降低性能

因此,只要您不需要每次迭代都使用全新的类,第一个脚本对您来说就更好了,因为它只创建一次
DateInterval
对象并将其分配给变量


还有一点额外的信息:


请首先用有效语法制作一个示例!当然,在变量中保存一个对象比在内存中为许多对象创建空间要好。@Rizier123在我的第一个示例中,什么是无效的?顺便说一句:我不知道,如果你注意到每个问题下面都有一个小小的闪亮的
Edit
链接,在这样一个由社区支持的网站上,它经常被用来纠正无效的语法等:>@hek2mgl你认为我从上个小时开始在等什么:问这个问题,弄清楚这个问题:D@hek2mgl对不起,伙计们。咖啡不够+复制粘贴=时间浪费综合症。希望,现在它是正确的!:>一、 当然,完全理解逻辑上的差异,你在回答中强调了这一点。也许,我在我的问题中没有充分表达这一点(对此表示抱歉),但我是专门针对这样一个场景提出的——当对象的创建返回静态值时,该值会在下面的循环中反复使用。在这种情况下,您的第二个答复(以及此处的其他答复)适用。谢谢你,我重新措辞了。这封信是写给匿名读者的,而不是写给你的。。在这种情况下,使用静态值(如示例中所示)的第一个版本会更好,因为我提到的原因是:内存使用更少,函数执行更少。
<?php


$dateInterval = 5;
$startDate = new DateTime();

for($di = 0; $di <= $dateInterval; ++$di)
{
    $theDate = ($di > 0) ? $startDate->add(new DateInterval('P1D')) : $startDate;

   // ...
}
number of ops:  25
compiled vars:  !0 = $dateInterval, !1 = $startDate, !2 = $di, !3 = $theDate
line     # *  op                           fetch          ext  return  operands
---------------------------------------------------------------------------------
   4     0  >   ASSIGN                                                   !0, 5
   5     1      FETCH_CLASS                                   4  :1      'DateTime'
         2      NEW                                              $2      :1
         3      DO_FCALL_BY_NAME                              0          
         4      ASSIGN                                                   !1, $2
   7     5      ASSIGN                                                   !2, 0
         6  >   IS_SMALLER_OR_EQUAL                              ~6      !2, !0
         7    > JMPZNZ                                        A          ~6, ->24
         8  >   PRE_INC                                                  !2
         9    > JMP                                                      ->6
   9    10  >   IS_SMALLER                                       ~8      0, !2
        11    > JMPZ                                                     ~8, ->21
        12  >   INIT_METHOD_CALL                                         !1, 'add'
        13      FETCH_CLASS                                   4  :10     'DateInterval'
        14      NEW                                              $11     :10
        15      SEND_VAL                                                 'P1D'
        16      DO_FCALL_BY_NAME                              1          
        17      SEND_VAR_NO_REF                               0          $11
        18      DO_FCALL_BY_NAME                              1  $13     
        19      QM_ASSIGN_VAR                                    $14     $13
        20    > JMP                                                      ->22
        21  >   QM_ASSIGN_VAR                                    $14     !1
        22  >   ASSIGN                                                   !3, $14
  12    23    > JMP                                                      ->8
        24  > > RETURN                                                   1