PHP面向对象之旅:类型提示

解决PHP弱类型带来的一些类型问题
服务器君一共花费了215.231 ms进行了5次数据库查询,努力地为您提供了这个页面。
试试阅读模式?希望听取您的建议

PHP是弱类型语言,向方法传递参数时候也不太区分类型。这样的使用会引起很多的问题,PHP开发者认为,这些问题应该是由代码书写者在书写代码时进行检验以避免。

没有类型提示很危险

下面的代码可能会出现问题。

<?
class NormalUser{
	/*
	* 其它相关代码..省略........
	*/
	private $age;
	public function setAge($_age){
		$this->age = $_age;
	}	
	public function getAge(){
		return $this->age ;
	}
}
$normalUser = new NormalUser();
$normalUser->setAge("I am tom"); //这里我们传输一个非数值.
echo "age is " .$normalUser->getAge();
//注意输出结果不是我想要的类型.
?>

程序运行结果:

age is I am tom

原始类型的类型判断

PHP中提供了一些函数,来判断数值的类型。我们可使用is_numeric()。判断是否是一个数值或者可转换为数值的字符串。

其它相关的还有is_bool()、is_int()、is_float()、is_integer()、is_numeric()、is_string()、is_array() 和 is_object()。

于是代码有了修改:

<?
class NormalUser{
	/*
	* 其它相关代码..省略........
	*/
	private $age;
	public function setAge($_age){
		if(is_numeric($_age)){
			$this->age = $_age;
		}		
	}	
	public function getAge(){
		return $this->age ;
	}
}
$normalUser = new NormalUser();
$normalUser->setAge("I am tom"); //这里我们传输一个非数值.
echo "age is " .$normalUser->getAge();//看到这里的结果为空.
echo  "<br>";
$normalUser->setAge("100");
echo "age is ".$normalUser->getAge();// 这里就有了结果.
?>

程序运行结果:

age is 
age is 100

向方法内传递对象

如果传递的参数是一个对象呢?下面的代码用起来很正常。

<?
class NormalUser {
	private $name;
	public function setName($_name){
		$this->name = $_name;
		//这里有存入数据库等等代码....
	}
	public function getName(){
		return $this->name;
	}
}
class UserAdmin{
	//这里定义的参数,第一个是User类的实例,第二是要设置的名字.
	public static function changeName($_user,$_name){
		$_user->setName($_name);
	}
}
$normalUser = new NormalUser();
UserAdmin::changeName($normalUser,"Tom");
echo "userName is " . $normalUser->getName();
?>

程序运行结果:

userName is Tom

我们还有一个类,和图书相关的类,在图书类中也可以设置图书的书名setName($name)。

如果我向,刚才代码中的方法changeName() 中传入一个Book的实例,原定于改变人名的方法现在改变了书的书名。

这有什么风险?能把脏衣服扔到洗衣机里面去洗,同样的清洗,把盘子和碗都扔进洗衣机里面洗洗试试。

下面的代码演示我们不想看到的一幕。

<?
class NormalUser{
	private $name;
	public function setName($_name){
		$this->name = $_name;
	}
	public function getName(){
		return $this->name;
	}
}
class Book{
	private $bookName;
	public function setName($_name){
		$this->bookName = $_name;
	}
	public function getName(){
		return $this->bookName;
	}	
}
class UserAdmin{
	public static function changeName($_user,$_name){
		$_user->setName($_name);
	}
}
$book = new Book();
UserAdmin::changeName($book,"Tom");
echo "bookName is " . $book->getName();
?>

程序运行结果:

bookName is Tom

类型提示保障数据安全

为了避免对象类型不规范引起的问题,PHP5中引入了类型提示这个概念。

在定义方法参数时,同时定义参数的对象类型。

如果在调用的时候,传入参数的类型不对会报错。这样保证了数据的安全性。

<?
class NormalUser {
	private $name;
	public function setName($_name){
		$this->name = $_name;
	}
	public function getName(){
		return $this->name;
	}
}
class UserAdmin{
	public static function changeName(NormalUser $_user,$_name){
		$_user->setName($_name);
	}
}
UserAdmin::changeName("anyType","Tom");
?>

程序运行结果:

Catchable fatal error: Argument 1 passed to UserAdmin::changeName() must be an instance of NormalUser, string given, called in E:\PHPProjects\NowaMagic\php\php_TypeTips.php on line 221 and defined in E:\PHPProjects\NowaMagic\php\php_TypeTips.php on line 217

建议在定义方法参数时,要使用类型提示。

如果类型不是对象,要采用代码进行类型建议,以增强安全性。

延伸阅读

此文章所在专题列表如下:

  1. PHP面向对象之旅:类和对象
  2. PHP面向对象之旅:类的属性
  3. PHP面向对象之旅:类的方法
  4. PHP面向对象之旅:对象的比较
  5. PHP面向对象之旅:构造函数
  6. PHP面向对象之旅:类的继承
  7. PHP面向对象之旅:访问控制
  8. PHP面向对象之旅:方法覆盖
  9. PHP面向对象之旅:this关键字
  10. PHP面向对象之旅:parent::关键字
  11. PHP面向对象之旅:再谈重载
  12. PHP面向对象之旅:获取用户数据
  13. PHP面向对象之旅:用户权限管理类
  14. PHP面向对象之旅:static变量与方法
  15. PHP面向对象之旅:单例模式
  16. PHP面向对象之旅:final类和方法
  17. PHP面向对象之旅:PHP中的常量
  18. PHP面向对象之旅:抽象类
  19. PHP面向对象之旅:抽象方法
  20. PHP面向对象之旅:抽象类继承抽象类
  21. PHP面向对象之旅:静态抽象方法
  22. PHP面向对象之旅:模板模式
  23. PHP面向对象之旅:接口与抽象方法
  24. PHP面向对象之旅:接口的实现
  25. PHP面向对象之旅:接口的继承
  26. PHP面向对象之旅:类型提示
  27. PHP面向对象之旅:PHP的多态
  28. PHP面向对象之旅:instanceof运算符
  29. PHP面向对象之旅:接口与组合模拟多继承
  30. PHP面向对象之旅:一个接口实例
  31. PHP面向对象之旅:简单工厂模式

本文地址:http://www.nowamagic.net/librarys/veda/detail/1107,欢迎访问原出处。

不打个分吗? 还木有人打分噢!

转载随意,但请带上本文地址:

http://www.nowamagic.net/librarys/veda/detail/1107

如果你认为这篇文章值得更多人阅读,欢迎使用下面的分享功能。
小提示:您可以按快捷键 Ctrl + D,或点此 加入收藏

阅读一百本计算机著作吧,少年

很多人觉得自己技术进步很慢,学习效率低,我觉得一个重要原因是看的书少了。多少是多呢?起码得看3、4、5、6米吧。给个具体的数量,那就100本书吧。很多人知识结构不好而且不系统,因为在特定领域有一个足够量的知识量+足够良好的知识结构,系统化以后就足以应对大量未曾遇到过的问题。

奉劝自学者:构建特定领域的知识结构体系的路径中再也没有比学习该专业的专业课程更好的了。如果我的知识结构体系足以囊括面试官的大部分甚至吞并他的知识结构体系的话,读到他言语中的一个词我们就已经知道他要表达什么,我们可以让他坐“上位”毕竟他是面试官,但是在知识结构体系以及心理上我们就居高临下。

所以,阅读一百本计算机著作吧,少年!

《高性能JavaScript》 Nicholas C. Zakas (作者), 赵泽欣 (合著者), 丁琛 (译者)

《高性能JavaScript》揭示的技术和策略能帮助你在开发过程中消除性能瓶颈。你将会了解如何提升各方面的性能,包括代码的加载、运行、DOM 交互、页面生存周期等。雅虎的前端工程师 Nicholas C. Zakas 和其他五位 JavaScript 专家介绍了页面代码加载的最佳方法和编程技巧,来帮助你编写更为高效和快速的代码。你还会了解到构建和部署文件到生产环境的最佳实践,以及有助于定位线上问题的工具。如果你使用 JavaScript 构建交互丰富的 Web 应用,那么 JavaScript 代码可能是造成你的Web应用速度变慢的主要原因。

更多计算机宝库...