您的位置:首页 > 编程语言 > PHP开发

PHP面向对象中类方法的两种类型:1、基本类型

2015-11-05 17:04 896 查看
在PHP的世界里面,数据类型决定了代码的处理数据的方式。例如:字符串类型显示字符串数据并用字符串函数来处理这些数据;数学表达式中使用整形,测试表达式中使用布尔型,等等。这些都称为“基本数据类型”;

从更高层次上来说,每个类都定义了一种数据类型,如下面的一个类:

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。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: