从 PHP 一道测试题说起

简介:

前几天一位西安的 PHPer 给我说起一道 PHP 的测试题:

    

 
  1. <?php 
  2.       $s = ‘abc’;  
  3.       if ($s==0)  
  4.         echo ‘is zero<br>’;  
  5.       else  
  6.         echo ‘is not zero<br>’;  
  7.     ?> 

    好多人答错了,认为答案是输出字符串“is not zero”。其实正确答案应该是输出字符串“is zero”。

    原因其实简单,因为 PHP 是一门弱类型的语言,它对变量没有“必须先定义再使用”的强制要求,变量的类型也是根据赋值的类型来灵活变化的。这一“灵活性”看似灵活,实际上埋下了错误的隐患。虽然 $s = ‘abc’; 语句定义了变量 $s 为字符串类型,但因为 if ($s==0)语句中,$s 是和数字型常量比较,所以 $s 这时被隐含的转换成了数字型变量,其值是 0,所以 $s==0 比较的结果就为真。

    犯这一类型错误的人一般是从 Java、C 等语言转到 PHP 开发的程序员,因为 Java、C 等语言是强类型语言,是不允许不同类型的变量和常量相互比较的,在这种情况下会报告语法错误。

    其实 PHP 语言的开发者并不是没有注意到这类问题,在 PHP 语言里还有一个严格比较的运算符“===”,要求比较的双方必须类型一致,把上述 if ($s==0) 语句写为 if ($s===0) 就会避免前述错误的发生。

    上面的问题提示我们,使用 PHP 这类弱类型的语言一定要注意变量类型的问题。在定义变量时可以赋一个初始值以同时定义其类型。而现在的大多数新开发的语言比如年轻的 C# 就是强类型语言,前述在 PHP 里的问题在C#里是不会发生的。

    比较有意思的是,这位西安的 PHPer 给我提起前述的测试题并不是为了探讨技术问题,而是说,现在的 PHPer 好多是自学成才,基本功欠佳,长期扑身在项目开发一线,对一些细枝末节的技术问题无暇顾及,导致犯一些隐含的、低级的错误,而这些错误有时是致命的。

    其实我也早注意到这个问题。我年初在 TM 群里和一位有 4 年从业经历的 PHP 程序员聊天,他提到他去一家公司应聘,卡在了笔试这一关。如果让他在机器里的 PHP 环境下答这些 PHP 笔试题,应该不是问题,拿不准的可以马上写一段代码测试,但笔试要求所有的知识必须从人脑而不是电脑里提取,这位有4 年 PHP 编程经验的 PHPer 就傻眼了,其实那些语法大多数都是常用的。

    PHP 语言和 PHPer 现在有一个奇异的现象,需求和程序员的供应矛盾很突出,PHP 教育和培训在国内也做的很一般,许多 PHPer 都是自学成才,甚至拿一段代码就开始步入开发环节,结果是没有建立系统的知识体系,基础知识差,好多人还停留在面向过程的编程阶段,而且振振有词,号称他们只用编写函数就能解决一切问题。一些人从来没听说过 PHP 里还有框架,自然面向对象的思维就无从谈起了。

    PHP 的开发者其实野心还是很大的,他们打算把 PHP 打造成一个类似 Java 虚拟机的玩意,到时候用 PHP 开发桌面程序都不是不可能的。但现状令人沮丧和担忧,教育跟不上,PHPer 大牛成长不起来,PHP 的大厦可能只能是一个小狗窝。

    本人是一个 PHP 程序员和教员,但没打算成为一个 PHP 的教徒和殉道者,仅仅是希望让 PHP 干些它自己能干的事,目前看来它在网站建设、互联网领域的应用非常优秀,比如流行的论坛、Web2.0应用、SNS 等许多系统是用 PHP 开发的。现在也有一些企业开发应用了 PHP 的一些开源框架,也非常不错,没听说 PHP 开发的东西比 java 和 .NET 差。希望 PHP 和 PHPer 在中国一路走好,前途光明。












本文转自网眼51CTO博客,原文链接:http://blog.51cto.com/itwatch/286521,如需转载请自行联系原作者

相关文章
原生php实现列表接口+分页接口+排序接口组合使用+包括测试数据(不加任何封装)
原生php实现列表接口+分页接口+排序接口组合使用+包括测试数据(不加任何封装)
原生php实现列表接口+分页接口+排序接口组合使用+包括测试数据(不加任何封装)
|
12月前
|
设计模式 SQL 安全
PHP中的设计模式:单例模式的深入探索与实践在PHP的编程实践中,设计模式是解决常见软件设计问题的最佳实践。单例模式作为设计模式中的一种,确保一个类只有一个实例,并提供全局访问点,广泛应用于配置管理、日志记录和测试框架等场景。本文将深入探讨单例模式的原理、实现方式及其在PHP中的应用,帮助开发者更好地理解和运用这一设计模式。
在PHP开发中,单例模式通过确保类仅有一个实例并提供一个全局访问点,有效管理和访问共享资源。本文详细介绍了单例模式的概念、PHP实现方式及应用场景,并通过具体代码示例展示如何在PHP中实现单例模式以及如何在实际项目中正确使用它来优化代码结构和性能。
160 2
|
设计模式 人工智能 算法
PHP中的设计模式:策略模式的深入解析与实践软件测试中的人工智能革命:提升效率与准确性的新篇章
在PHP开发中,理解并运用设计模式是提升代码质量和可维护性的重要途径。本文聚焦于策略模式(Strategy Pattern),一种行为型设计模式,它允许在运行时选择算法或业务规则。通过本文,我们将深入探讨策略模式的定义、结构、使用场景以及如何在PHP项目中有效地实现和利用策略模式。不同于性能优化等技术性摘要,本文着重于提供对策略模式全面而实用的理解,助力开发者编写出更加灵活和可扩展的应用程序。 本文深入探讨了人工智能在软件测试领域的应用,揭示了其如何显著提高测试过程的效率和准确性。通过实际案例分析,展示了AI技术在自动化测试、缺陷检测及结果分析中的关键作用,并讨论了实施AI测试策略时面临的挑
89 3
|
11月前
|
测试技术 PHP 开发工具
php性能监测模块XHProf安装与测试
【10月更文挑战第13天】php性能监测模块XHProf安装与测试
111 0
|
测试技术 PHP 开发者
原生php单元测试示例
通过上面的示例,我们可以看到,即使在缺乏专门测试框架的情况下,使用原生PHP代码进行基本的单元测试也是完全可行的。当然,对于更复杂的项目,利用像PHPUnit这样的专业工具将带来更多的便利和高级功能。不过,理解单元测试的基本概念和能够手工编写测试是每个PHP开发者的宝贵技能。
73 4
|
测试技术 PHP 开发者
原生php单元测试示例
通过上面的示例,我们可以看到,即使在缺乏专门测试框架的情况下,使用原生PHP代码进行基本的单元测试也是完全可行的。当然,对于更复杂的项目,利用像PHPUnit这样的专业工具将带来更多的便利和高级功能。不过,理解单元测试的基本概念和能够手工编写测试是每个PHP开发者的宝贵技能。
62 1
|
数据库
基于PHP+MYSQL开发制作的趣味测试网站源码
基于PHP+MYSQL开发制作的趣味测试网站源码。可在后台提前设置好缘分, 自己手动在数据库里修改数据,数据库里有就会优先查询数据库的信息, 没设置的话第一次查询缘分都是非常好的 95-99,第二次查就比较差 , 所以如果要你女朋友查询你的名字觉得很好 那就得是她第一反应是查和你的缘分, 如果查的是别人,那不好意思,第二个可能是你。
166 3
|
测试技术 PHP 开发者
原生php单元测试示例
通过上面的示例,我们可以看到,即使在缺乏专门测试框架的情况下,使用原生PHP代码进行基本的单元测试也是完全可行的。当然,对于更复杂的项目,利用像PHPUnit这样的专业工具将带来更多的便利和高级功能。不过,理解单元测试的基本概念和能够手工编写测试是每个PHP开发者的宝贵技能。
66 0
|
PHP 数据库
对PHP源码的测试
对PHP源码的测试