@
lizheming 哈哈。其实,我搞清楚这个问题之后,一直是在抱怨,可能我用了疑问句,所以让你误解了。我觉得我再不说清楚咱们俩都得进入死循环了。
因为我知道这个问题就算我在这里问也是搞不清楚的,因为要认真的阅读过源代码才会了解。所以我希望是在PHP新闻组上得到解答,或者被忽略。
不过你说的这个“因为只有得到 $str['check']是什么才能确定是否有0键”,没错啊,但是不一定要先估值转换啊,它可以直接因为$str['check']这个根本不合法而直接返回false啊对不对?
这个问题呢,就像是我写了个很垃圾的函数,叫做,嗯……比如说get_file_contents,嗯,get_file_contents。它是用来打开文件的,但是这个函数有个很讨厌的功能,就是如果这个文件不存在并且目标文件的文件名是以PHP结尾的话,他会给你建立一个文件,然后写入“PHP是最好的语言”这个字符串,然后返回。
有一天,你用到了这个函数,用来它来获得一个文件,比如叫“任何文件”。但是这个文件可能存在也可能不存在。问题是这个文件的文件名不是由你控制的(而是由其他程序员以及配置控制的)。
你搞清楚了get_file_contents的机制知道有这个问题。于是为了安全,你效验了文件名,写下了如下代码:
if (文件名的结尾(文件名变量) != 'PHP') {
return get_file_contents(文件名变量);
} elseif (文件存在(文件名变量)) {
return 另一个更加麻烦或者因为某些原因不建议使用的函数(文件名变量);
}
然后你开始了抱怨,是啊,如果get_file_contents没有判断文件是不是以PHP结尾这样糟糕的特性该多好,那时候你就可以直接return get_file_contents(文件名变量);了不是么?
于是你抱怨上了论坛。询问get_file_contents为什么会这样?
这个时候另一个人看到了你的问题,会答到:
这是因为get_file_contents会判断文件名结尾,然后调用另一个函数put_file_contents来写入“PHP是最好的语言”。
然后你说,为什么需要这样?难道返回一个false不是更好么?
这时候那人又说,你得读文件啊,文件必须读过才知道是不是有内容啊,这都发生在put_file_contents之后。
所以你看,我们的方向是不一样的。我期待的讨论是,是不是底层上有什么结构会导致我的设想无法成立,另外是不是我的设想就不对呢?接着我还可能会问“那么为什么不能实现我的设想,因为那样更加直觉正确”,最后可能真的能促成这件事(虽然,这,简直微乎其微,大PHP怎么会为这点小事而改动)。
我期待的结果可能是比如这样的讨论“$string对于编译器来说是一个T_VARIABLE,除此之外编译器对其一无所知。而isset发生与编译阶段,于是它只知道$string的类型,而不知道$string其中内容的类型”。当然前面是扯淡,PHP会解析这些东西,然后得到所有TOKEN的必要信息,包括它是什么以及他里面是什么(何况或许根本就没有“里面”这东西,只是地址引用)。
所以,嗯,咱们继续等那边啥情况吧,或许我真的被忽略了。
不过就我自己这种情况来看,isset($string['check'][1]) + is_string($string['check'])工作良好。但或许我应该改成!empty($string['check']) + is_string($string['check'])。因为我发现他们都是通过zend_do_isset_or_isempty来实现的,只是作为第一个参数type,被设定成ZEND_ISEMPTY或者ZEND_ISSET而已。
而这个type也就是在检查zend_is_function_or_method_call以及设定op编译扩展信息的时候用了下。(当然我还没完整看过代码,还是闭嘴的好。)
好了不吧唧了,我继续做项目去了。也感谢你一直聊这个话题。