PHP构造器的"坑"

起因

从学PHP的时候起我就知道PHP构造器应该是用__construct方法,
但是最近在接入微信的搜一搜功能的时候却被坑了一把。

坑1-腾讯的示例代码

微信搜一搜文档中下载的PHP示例代码中,构造函数使用Java风格写的,就是构造函数和类名相同。

而标准写法应该是下面这种

由于以前也写过Java,所以一开始看示例代码的时候没有发现问题,然后我也通过php-cli运行了示例代码,是没有问题的。
当然,后来回想一下是自己忽略了一些warning信息才导致最终踩到坑。但是代码运行结果是正确的。
后来我就把示例代码搬到了项目里,结果就老是在初始化的时候没有能够正确设置对应的类属性,我就觉得奇怪,通过debug了之后才突然意识到是构造函数没写对。

我就很奇怪为什么相同版本的PHP(7.0),命令行就可以跑出结果,通过fpm解释就错了呢。

坑2-PHP官方文档

我先查看的中文文档,现在我直接画出了关键点,但是在我查问题的时候,我关注到的却不是红线标出的命名空间问题,而是自”PHP5.3.3起”,而我用的是PHP7.0,我自然地就觉得老的构造方法就是应该失效了才对呀。

在我准备些文章吐槽为啥php-cli和php-fpm解释代码的效果不一致的时候,我决定再去看看英文文档怎么写的,因为经验告诉我好多翻译的文档都不是最新的。

首先我就看到了最大的区别,一个红色的warning部分,写了7.0之后就会弃用老的构造方法,后面可能会直接移除。我就以为自己找到了问题的原因了,很得意的说:果然中文文档坑人。

然而我又一次仔细阅读了英文的这部分文档之后,发现了本质的问题并不是红色的warning部分。而是最后一句”This change does’nt affect non-namespaced classes.”

这下我才真正明白造成我认为的php-cli和php-fpm解释代码不一致的现象的锅在命名空间这。
腾讯给的示例代码是传统的PHP风格写的代码,调用其他文件的类或者函数是通过include方法,并没有命名空间的概念。
而我移到项目里面之后,我添加了命名空间,所以就直接跑不通,报错了。

总结

其实,从这个小问题中我还是能看到自己的一些问题。

  1. 运行示例代码的时候不仔细,忽略了告警信息,导致问题延后发现。
  2. 当调试发现问题之后,急于吐槽别人是坑货。
  3. 很幸运,我有一颗探寻真相的心,但是阅读文档不够仔细。可能也是中文翻译之后,遗失了原来的重点,仔细对比一下原文和翻译,翻译的意思没有问题,但是丢失了转折这个元素,如果能在最后一句前面加一个“但是,”就会突出原文想表达的意思了。
  4. 看英文原版文档确实很重要,当我再次查看原版文档的时候才真正get到了这个问题的本质,不然我就真的连PHP官方文档一起吐槽了。原版文档有两个优势:1. 文档最新最全;2. 重点突出,语义明确,容易获取关键信息。
加载评论框需要科学上网