写了这么久PHP,在心血来潮在StackOverflow上回答了别人PHP的问题,没想到被扣分还说没常识,求研判。

2013-04-29 12:40:51 +08:00
 raincious
这是我回答的地址:
http://stackoverflow.com/questions/16262944/emailing-an-array-from-html-form-via-php/16263381#16263381

之前总是通过Google得到StackOverflow的搜索结果,于是昨天就注册了,正好遇到别人提的问题我知道,于是就回答了,但是。。。。但是啊。。。就是在补充一点意见的时候,某个家伙。。就这么给我的回答扣分了。。。。感觉很悲剧。

但是还是想知道我这样处理是不是正确,所以发上来希望大家讨论下。

具体是这样的,我认为在PHP里,在楼主那情形下不需要isset,关掉E_NOTICE的警告就好了。但那家伙认为,我这样做违背了常识,(意思似乎说error_reporting(E_ALL)万岁?),但是我觉得不对。

所以想问问大家具体都是怎么处理变量未初始化的?

我先来说说我,一般都是习惯于先初始化好,不可能存在不初始化的变量,也就不需要isset了:

function($input) {
$sA = $sB = '';
$iA = $iB = 0;
$aA = $aB = array();

// do your code here
}

大家呢?
10790 次点击
所在节点    PHP
48 条回复
laoyuan
2013-04-30 10:13:06 +08:00
可能LZ同事啥的也上v2ex,面子上过不去。。。
raincious
2013-04-30 11:26:28 +08:00
@laoyuan 还真不在。我对我自己的代码要求很严,但是对notice我是有选择处理,不是每一个notice都做屏蔽,比如如果if ($a == 'yes') 这样后面不会导致问题,那就这样好了。

说真的,我写过的代码中,从来没有因为undefined index或变量出过任何问题。所以我当然认为,关键在于你知道这个notice怎么来的,会导致什么,要如何控制,之后你怎么处理才不会导致问题是你自己的事。

当然,大家建议去掉所有导致的问题我已经了解了,事实上@AlloVince对notice已经解释的很明白,配合@python的例子,对我来说已经形成了处理的Pattern。

当然,我觉得这个帖子从一开始已经变味,我并不是在讨论是不是要彻底不管errors,而是处理方式的问题罢了。

@Leask 我真的很耐心,只是回复的信息对我来说还没形成体系才一再追问罢了。Pattren(How)有了,但是Why不完整,所以我才对回答不满意。比如我说8楼,几个表达式效果是一样的,这个问题就无人涉及,是不是因为在反正不能让notice出现这一前提下,大家都无视了那个问题呢。

我真心希望是你回答了我的问题。谢谢。
ShiningRay
2013-04-30 12:33:04 +08:00
楼主如果你发这贴是为了寻找认可和共鸣我觉得就错了。

可能楼主剑走偏锋,有自己的一套打法,但你的经验可能适合你的工作环境,对别人来说则可能不合适,最后站在不一样的立场上进行讨论,最后讨论只能变味。

所以,你应该把自己的方法论给完整的梳理一遍,可以考虑自己写一个系列的文章,把自己的经验总结一下,让大家明白和清楚。


简单的说,等你出名了自然有人捧你。
Leask
2013-04-30 12:33:11 +08:00
有时候我们不但要考虑代码在小范围内是否流畅运行。当然,这和你参与项目的规模和复杂程度有关。我留意到你提到你是写框架的。我在连续两家公司是做后端框架的。你应该知道很多时候你不能完全预料一切的input都是可以预料的。如果在框架层不能做到 notice free 的话,我觉得代码是没有达到要求的。至于你说你也对代码要求也很高,我只能说不同的人对「高」的理解不一样。

其次,作为越靠近后方的开发者,你必须明白自己提供的基础设施必须是尽可能可靠的。那么,你处理异常的方式应该尽可能地符合「最佳实践」这样有助于你的同事和你提供的api的「开发者用户」更能理解。

鉴于这几点,真的不要问 why 了。
Cadina
2013-04-30 12:37:46 +08:00
大家不要再喷LZ了,LZ是来卖萌的。。
(把NOTICE关掉,我看不见啊,看不见~~)
davepkxxx
2013-04-30 12:39:57 +08:00
这就和Java里不论什么情况,直接把异常给捕获,也不给交代,或者直接网上抛差不多。
raincious
2013-04-30 16:43:40 +08:00
@Leask 刚才尝试下将我框架内的Notice修补,由于我用数组很多,很多数组在类里面 public $array = array(); 就好了,之后就动态使用,需要时判断,所以很多Undefined Index。

但是改掉这些之后,目前看来没什么收益,当然也没什么损失,可能是因为框架比较老的缘故,还有待观察。我写这个框架的时候Discuz还是7,也有一堆堆的Undefined,Wordpress里面当时也是一堆Undefined,phpBB里面也是一堆Undefined、IPB和VBB里也是一堆Undefined。于是这么多Undefined,我对Undefined也就没感觉了,觉得就应该这样。

反正目前正在准备新框架了,因为目前的框架是为规模不大的网站设计的,很多东西没有灵活的考虑到,比如插件、PDO和ORM之类。新框架写的时候会注意Undefined这样的问题。目前的架构处于稳定性考虑就先如此好了。

现在Wordpress用新架构之后倒是没有多少Notice了,可能去掉Notice这是趋势吧。用新的OO风格去写,可能本身Notice也不会很多。
evlos
2013-04-30 22:48:08 +08:00
恩,没人能 100% 保证自己这辈子不会做什么事情,也没人能 100% 保证自己有一天不会手滑而且手滑的时候不会造成巨大的损失,所以大家的建议都是关于尽量地养成不留隐患的好习惯。

我的习惯主要是一般数组都要看看 index 是否存在,文件也得看看是否存在,变量如果初始化了一般不用管,但是用户输入的一定要看看 $_POST['xxx'] 之类的有没有输入进来,输入进来之后最好拿正则式检查一遍。

开发环境一定 E_ALL | E_STRICT。
生产环境 E_ALL & ~E_DEPRECATED,display_error 关掉。
日志非常重要,大型网站一般配备日志服务器,可以从此看出日志的重要性,就算不重要的日志,也可能成为某些隐患。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/67309

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX