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

来源:互联网 发布:拼音记单词软件 编辑:程序博客网 时间:2024/06/17 09:13

在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。

0 0
原创粉丝点击