2012-07-16 21 views
5

首先我知道这个问题已经围绕不止一次在这里:E_NOTICE:修复每一个问题真的有用吗?

但更多的,我解决所有E_NOTICEs(因为有人说你应该)越我注意到:

  • 我微优化
  • 其实我做更多的代码,使我的代码难于十个分量和慢

拿一个例子:

说使用MongoDB的PHP驱动你的,你必须在一个名为ts内一类变种一个MongoDate对象一个表示数据库集合中单个行的类。现在你访问这个变量,如:$obj->ts->sec但PHP抛出一个合适的(E_NOTICE),因为在这种情况下ts没有被定义为一个对象本身,因为这个特定的行没有ts字段。所以你认为这是好的,如果它没有设置返回null,这是我们期望的行为,并且我会在解释器自己的机器人工作之外自己处理它(因为如果var是功能,则返回1970nullnone-object)。

但现在要修复E_NOTICE作为另一个开发人员真的希望我,因为有任何E_NOTICEs是terribad,并且它使代码变得更慢,不根据错误执行它。所以我做的$obj类的新功能叫getTs,我给它3条线路,从字面上做什么,但检查ts var是一个MongoDate对象并返回它,如果它是...

为什么?在应用程序本身的运行时间内,PHP不能在它的快速解释器中为我完成这项工作吗?我的意思是每一处我不得不为我的代码添加无用的凹凸,几乎空的函数来检测变量,我实际上只是用PHP自己处理的能力来返回null或检查他们的instanceof当我真的需要时(当它是至关重要的操作和行为的功能),并没有让我开始在isset() s我已经添加了约300行isset() s,它已经失控。我当然得让这个getTs功能,因为你不能做的:

class obj{ 
    public $ts = new MongoDate(); 
} 

我要么必须存储__constructor内的ts(这我不是太高兴要么,我使用了很多)或者使用函数来检测它是否已设置(我现在所做的)。

我的意思我明白为什么我应该修正:

  • 未定义瓦尔
  • 分配未设置瓦尔的性质(null增值经销商)
  • 恒错误等

但是,如果你已经测试你的代码,你知道它是安全的,只会按照你想要的方式工作,修复所有的undefined indexnone-object er RORS?是不是加了一堆isset() s和2行函数来实际对你的代码进行微优化?

我已经做了一半的网站E_NOTICE兼容,实际上它使用更多的CPU,内存和现在时间后发现......所以真的有什么处理每一个E_NOTICE错误点,而不是仅仅是错误的呢?

感谢您的想法,

+0

你不应该。相反,你应该处理异常。但是...欢迎来到PHP! – 2012-07-16 18:34:44

+0

@ IgnacioVazquez-Abrams事实上,PHP应该是一种动态语言,但是修复所有这些'E_NOTICES'我认为至少有1000个人认为不要在他们的市场营销中宣传动态,但更多的是...... – Sammaye 2012-07-16 18:44:25

+0

你'我们会发现PHP是90%的营销,9%的努力和1%的疯狂。 – 2012-07-16 18:46:38

回答

3

无论你是否应该解决这些问题肯定是有争议的,并且将只取决于你的情况的回报;例如,如果代码的寿命更长,开发人员更多,则更重要。

通常,假设您的函数将被其他人使用(并被错误使用)是最佳实践,所以你应该做isset /!empty/is_object检查来解决这个问题。通常情况下,你的代码会发现它的用途和情况,你从来没有打算用它。性能方面,每当引发任何类型的错误 - 包括E_NOTICE时 - 解释器都会启动错误处理程序,生成堆栈跟踪并设置错误的格式。关键是,无论你是否有他们的报告,错误总是执行缓慢;因此,2-3函数调用以避免E_NOTICE仍然会提高您的性能

编辑: 替代品上面的例子

我不一定会创建额外的对象,以避免错误;你可以优雅地避开它们。这里有几个选项:

1)该函数处理缺少TS:

SpecialClass class { 

    funciton getTs() { 
     return !empty($this->ts) ? $ts->sec : false; 
    } 
} 

2)应对模板/程序丢失TS:

if (!empty($obj->ts->sec)) { 
    //do something 
} 

我特别喜欢empty()因为你可以用它来代替(isset($var) && ($var or 0 != $var //etc)),保存多个调用/比较,并且不会抛出目标var或属性的通知。如果你在一个不存在的变量的proplish /成员上调用它,它会抛出一个错误。

+0

所以说我有一个20个项目的活动流。在我上面的例子中,每个对象都有一个'MongoDate'对象。在每个父对象'$ obj'中创建一个新对象并且对该变量进行计算比允许PHP调用全局错误函数(内置或由用户预定义)更快,更高效? – Sammaye 2012-07-16 20:16:39

+0

要么这样(虽然我会建议如果没有设置,而不是立即创建一个返回false),或者只是在使用它之前测试返回:即:if(!empty($ obj-> ts)){// do stuff ; }或$ ts =!empty($ obj-> ts)? $ ts-> sec://备用值; – 2012-07-16 20:25:29

+0

Meh决定只是指挥下去做最后。我仍然注意到增加了CPU和内存消耗,即使我所做的所有事情都是根据对象是否存在添加更多的IF语句来作出决策。实际上可能会对此做一个白皮书。这种方法在HTML中非常难看,而PHP应该是一种动态语言......但无论如何,谢谢。 – Sammaye 2012-07-18 07:51:19

6

你当然做用isset()获得更好的性能做。我做了一些基准测试,不久之前,隐藏错误的速度大约慢了10倍。

http://garrettbluma.com/2011/11/14/php-isset-performance/

这就是说,性能通常不是在PHP中的一个关键因素。 做什么亲自让我疯狂的是无声错误

当解释者选择不将某些东西标记为错误(这可能导致不稳定)是一个巨大的问题。 PHP特别是有一种倾向,

  • 警告的事情应该错误(例如未能连接到数据库)和
  • 问题通知有关的事情,应该警告(如尝试访问空对象的成员)。

也许我对这种东西只是过分的认同,但我之前被这些沉默的错误咬过。 我建议在错误报告中始终包含E_NOTICE。

+1

+1尼斯链接,我想在一分钟内对我的网站进行基准测试,当我说处理所有E_NOTICE的速度比让PHP访问错误对象要慢时,我非常认真。实际上,新代码只是让我的服务器崩溃,因为它实际上是用对象填充整个内存......我所做的只是添加一个函数来定义一个新对象,如果它不存在......唯一区别:\ – Sammaye 2012-07-16 19:27:00

+1

它可能不是一个选项,但看看Xdebug。你可以分析你的代码并找出时间/内存在哪里花费最快。 (WinCacheGrind也是一个很好的配置文件查看器。) – 2012-07-16 19:30:31

+0

Aye我将不得不简要描述一下,理论上我的代码应该在每次迭代中使用一个内存点,但它不是,prolly一个编码错误,但这仍然只是一个例子,慢很难解释的地方... – Sammaye 2012-07-16 19:40:01