PHP面向对象中类方法的两种类型:1、基本类型
2015-11-05 17:04
896 查看
在PHP的世界里面,数据类型决定了代码的处理数据的方式。例如:字符串类型显示字符串数据并用字符串函数来处理这些数据;数学表达式中使用整形,测试表达式中使用布尔型,等等。这些都称为“基本数据类型”;
从更高层次上来说,每个类都定义了一种数据类型,如下面的一个类:
这里的test类也属于一个数据类型(这跟C#基本上是一样的)。
在这篇博客中,我们将会讨论PHP类方法中的两种类型:基本类型和对象类型。
基本类型:
C#作为一个强类型语言,必须在变量赋值前声明变量的类型,并且变量的值也必须是规定的类型。而PHP是一个弱类型语言,变量并不需要声明为特定的数据类型,PHP会根据需要自动检测。当然我们可以自动检测,is_bool(),is_integer(),is_array()等函数就是检测类型的函数。作为弱类型语言,PHP既有自身的优势,也有不足的地方。
看下面这个例子(随身带个栗子。。。)
可见,代码并没有按照我们的期望执行,getInfo()函数参数类型本应该是Bool类型的,我们传过去的是一个字符串,按常理,PHP应该会自动解析的呀!
事实上,字符串“false”在测试中解析为“true”了,这是因为PHP在测试变量的时候会转换一个非空字符串值为布尔值true。
因此有
等价于
解决方案:
1、使getInfo()方法更加宽松,而不只是仅仅接受bool值
2、不改动getInfo()函数,添加注释,使其他使用到这个类的程序员更容易的理解代码
3、让getInfo()函数严格检查参数的数据类型
事实上,采用哪种处理参数类型的策略,取决于任何潜在bug的严重程度。通常PHP会根据语境自定转换大多数的基本数据类型。但是我们在实际开发中应该保持良好的习惯,要明白某个变量应该属于哪种类型的。我们不能单单依靠PHP内在的转换机制来防止类型相关的bug。
从更高层次上来说,每个类都定义了一种数据类型,如下面的一个类:
class test{ // ... }
这里的test类也属于一个数据类型(这跟C#基本上是一样的)。
在这篇博客中,我们将会讨论PHP类方法中的两种类型:基本类型和对象类型。
基本类型:
C#作为一个强类型语言,必须在变量赋值前声明变量的类型,并且变量的值也必须是规定的类型。而PHP是一个弱类型语言,变量并不需要声明为特定的数据类型,PHP会根据需要自动检测。当然我们可以自动检测,is_bool(),is_integer(),is_array()等函数就是检测类型的函数。作为弱类型语言,PHP既有自身的优势,也有不足的地方。
看下面这个例子(随身带个栗子。。。)
//定义一个书的类 class Book{ public $title; public $author; //构造函数 function __construct($title,$author){ $this->title = $title; $this->author = $author; } public function getInfo($bool){ $str = "书名:".$this->title; //如果true,把作者的名字打出来 if($bool){ $str .= "作者:".$this->author; } return $str; } } $book = new Book("PHP从入门到精通","LSGO实验室.著"); $bool = "false"; $info = $book->getInfo($bool); print($info); //结果返回的是: /*书名:PHP从入门到精通 作者:LSGO实验室.著*/
可见,代码并没有按照我们的期望执行,getInfo()函数参数类型本应该是Bool类型的,我们传过去的是一个字符串,按常理,PHP应该会自动解析的呀!
事实上,字符串“false”在测试中解析为“true”了,这是因为PHP在测试变量的时候会转换一个非空字符串值为布尔值true。
因此有
if("false"){ //... }
等价于
if(true){ //... }
解决方案:
1、使getInfo()方法更加宽松,而不只是仅仅接受bool值
public function getInfo($bool){ //假如$bool是字符串的时候,我们也应该进行处理 if(is_string($bool)){ //$bool = ($bool=="false") ? false : true; $bool = preg_match("/false|no|off/i",$bool) ? false : true; } $str = "书名:".$this->title."<br/>"; if($bool){ $str .= "作者:".$this->author; } return $str; }
2、不改动getInfo()函数,添加注释,使其他使用到这个类的程序员更容易的理解代码
/** *函数功能:返回书本信息 *参数列表:bool 是否返回作者信息 */ public function getInfo($bool){ $str = "书名:".$this->title; //如果true,把作者的名字打出来 if($bool){ $str .= "作者:".$this->author; } return $str; }
3、让getInfo()函数严格检查参数的数据类型
public function getInfo($bool){ if(!is_bool($bool)){ die("参数类型要求是bool类型!!"); } $str = "书名:".$this->title; //如果true,把作者的名字打出来 if($bool){ $str .= "作者:".$this->author; } return $str; }
事实上,采用哪种处理参数类型的策略,取决于任何潜在bug的严重程度。通常PHP会根据语境自定转换大多数的基本数据类型。但是我们在实际开发中应该保持良好的习惯,要明白某个变量应该属于哪种类型的。我们不能单单依靠PHP内在的转换机制来防止类型相关的bug。
相关文章推荐
- PHP 多维数组根据某个字段排序
- 推荐给开发者的20个优秀PHP框架
- 修改PHP上传文件的大小限制
- Socket类的getInputStream方法与getOutputStream方法的使用
- [转]FastCGI模式下PHP占用大量内存的解决办法
- PHP实现快排
- phpexcel基本属性及应用
- 【转】关于cgi、FastCGI、php-fpm、php-cgi
- 微信公众号智能识别回复的实现(基于ThinkPHP框架)
- PHP抓取百度贴吧邮箱v1.0
- PHP编译configure时常见错误
- php购物车类
- php GD库类
- try catch如何正确使用--由php悟到的编程经验
- php文件上传类
- 利用php cookie实现浏览历史功能
- php学习笔记五:使用 xampp 部署多个站点
- php学习笔记三:修改 xampp 默认端口号
- php学习笔记二:第一个php程序 hello world!
- 关于laravel new no working一直卡着没反应问题