PHP中的对象:更多或更少更好?

时间:2010-01-04 21:19:27

标签: php mysql datetime object

之前我曾问过aqbout时区和日期/时间,但这是一个更具体的问题,更多关于PHP中的对象。

<?PHP
//set the user's time zone on page load
date_default_timezone_set("America/Los_Angeles");

//convert the timestamp from DB into the user's time
$timestamp = '2008-05-01 13:44:19'; //this would normally be returned from mysql
echo ConvertDateTime($timestamp, "America/Los_Angeles");

//here is the function to convert it
function ConvertDateTime($timeString, $timeZone)
{
    if ( $d = new DateTime($timeString) ) {
        $d-&gt;setTimeZone(new DateTimeZone($timeZone));
        return $d-&gt;format("Y-m-d H:i:s");
    }
    return null;
}
?>

好吧这对某些人来说可能是一个愚蠢的问题但是我真的不太了解或者在课程和对象方面有很多经验,一般在页面上例如我将创建1个数据库对象并运行每个mysql查询具有该1个对象集的页面。我一直认为较少的对象可能更好但我在这个网站上看到,与1个对象相比,拥有数百个对象的速度和资源相同,不确定是否真实。

我的问题,在上面的函数中,你可以看到每次调用函数时都会创建一个新的DateTime对象,在我的情况下,在某些页面上可能会有100次。所以我应该使用像singlton一样,甚至我可以在我的数据库对象设置的标题中设置一次dattim对象,或者我应该让函数创建大量的对象?

请解释我应该做的优点和缺点,感谢任何建议,有些人可能会说我预先优化,我已经优化了当前网站超过2年,以便在我想要的地方,现在我正在重新构建那个SAME站点,所以我知道要期望的用户负载和东西,我宁愿现在修复这样的东西,而不是以后。

3 个答案:

答案 0 :(得分:3)

  

我应该像唱歌一样使用

Singleton并非没有问题 - 例如,他们经常进行(自动化)测试很困难。这是他们不那么喜欢“大”框架的原因之一(我正在考虑Zend Framework和Symfony,它们正在减少他们下一个主要版本的单身人数) < / p>


  

我可以设置一个dattim对象1次   标题

使用全局变量/对象也可以带有副作用;如果一个变量被称为“本地”,它应该是本地的 - 代码可读,并且理解它的能力通常比毫秒的一小部分更重要。


对于极端和特定情况,唯一的(true)解决方案是分析:您希望脚本/应用程序更快?要少用CPU?

然后,首先,描述它!它将有助于识别瓶颈 - 并向您展示您应该集中注意力的内容。

你有很多事情可以最快地优化(即花费更少的时间来思考,编码和测试) - 并且会让你获得更高的性能提升。


最后,您必须在:

之间进行选择
  • 最佳表现
  • 开发/优化某些东西的时间
  • 维持它所需的时间;包括你以外的其他人。

而且,通常情况下,一个新的,功能更强大的服务器(或第二个服务器)最终会花费不到几周的时间进行优化,只能获得5%!

(注意我没有说你不应该优化;但你不应该过度优化。)

答案 1 :(得分:0)

  

我总是认为对象更少   可能更好,但我已阅读   这个网站有数百个   对象的速度和速度相同   与1个对象相比使用的资源,   不确定这是不是真的。

其他对象需要额外的内存空间 - 因此您可以假设行动路径会产生反响(但是,它们可能不会引人注意/需要您采取行动)。

  

你可以看到每次创建一个新的DateTime对象   函数被调用,可能是100次   在我的情况下的一些页面上。所以   我应该像唱歌一样使用

是的,您可以使用单例 - 或者缓存页面的结果(您是在同一页面上显示多个不同的时间 - 或者在许多地方只显示相同的计算时间?)

答案 2 :(得分:0)

在这种情况下,每次调用函数时创建一个新对象都不会增加额外的内存使用量:每次剩下该函数时,都会释放内存。

如果您使用完全相同的$ timeString和$ timeZone多次调用该函数,则可能需要添加结果的缓存。如果大多数调用都是唯一的,我就不会添加缓存:它可能会帮助你提高速度,但是存储所有结果,而不重用它们会浪费内存。