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 "
";

$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

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

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

延伸阅读

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

php 显示对像编码,PHP面向对象之旅:类型提示相关推荐

  1. 《大话Java性能优化》面向对象及基础类型相关部分

    3.1 面向对象及基础类型 3.1.1 采用Clone()方式创建对象 Java语言里面的所有类都默认继承自java.lang.Object类,在java.lang.Object类里面有一个clone ...

  2. 矢量数编码有哪几种类型_6种最理想的编码工作(以及吸引每个人的类型)

    矢量数编码有哪几种类型 by David Venturi 大卫·文图里(David Venturi) 6种最理想的编码工作(以及吸引每个人的类型) (The 6 most desirable codi ...

  3. mysql存json将utf8编码 去掉,MySQL对JSON类型UTF-8编码导致中文乱码探讨

    原文:https://www.cnblogs.com/CreateMyself/p/12587426.html 前言 继上文发表之后,结合评论意见并亲自验证最终发现是编码的问题,但是对于字符编码还是有 ...

  4. Java黑皮书课后题第4章:*4.15(电话键盘)电话上的国际标准字母/数字映射如下所示。编写程序,提示用户输入一个小写或大写字母,然后显示对应数字。对于非字母输入,提示非法输入

    *4.15(电话键盘)电话上的国际标准字母/数字映射如下所示.编写程序,提示用户输入一个小写或大写字母,然后显示对应数字.对于非字母输入,提示非法输入 题目 题目概述 运行示例 破题 代码 题目 题目 ...

  5. Java黑皮书课后题第2章:2.18(打印表格)编写程序,显示下面的表格,将浮点数值类型转化为整数

    2.18(打印表格)编写程序,显示下面的表格,将浮点数值类型转化为整数 题目 题目描述 代码 方法评价 化繁为简:强制(数据)类型转换 题目 题目描述 2.18(打印表格)编写程序,显示下面的表格,将 ...

  6. 谷歌编码_如何通过学习编码赢得Google之旅

    谷歌编码 by MaskyS 通过MaskyS 如何通过学习编码赢得Google之旅 (How I won a trip to Google by learning to code) 设置场景 (Se ...

  7. JavaScript面向对象之Object类型

    大家都知道对象都是属于Object类型的.下面是一些详细总结,希望可以帮助到有需要的小伙伴. JavaScript面向对象之Object类型 在JS中所有的对象都拥有同一个父级,就是Object. O ...

  8. JavaScript面向对象之Function类型

    JavaScript面向对象之Function类型 下面是我对Function类型的总结,希望对您有帮助. "函数式编程"是一种"编程范式"(programmi ...

  9. 改变ubuntu终端显示语言(桌面系统是中文,终端提示是英文)

    一,永久有效: 1.打开终端:     vi .bashrc 2.最后添加: if [ "$TERM"="linux" ] ;then export LANGU ...

最新文章

  1. 在家想远程公司电脑?Python +微信一键连接
  2. Zynq的AMP开发注意事项之sdk_repo
  3. TypeScript—快速入门
  4. php网页多个倒计时,怎么实现一个页面有多个倒计时同时进行
  5. promise.all_所有您需要了解的Promise.all
  6. andriod开发增加一个菜单
  7. IPLATUI----GRID状态
  8. ChannelOption.TCP_NODELAY, true-浅谈tcp_nodelay的作用
  9. 多次字符串相加一定要用StringBuilder而不用 + 吗?
  10. Unity3D开发资料
  11. 2019西湖论剑网络安全技能大赛(大学生组)部分WriteUp
  12. 计算机相关常数,地址常数
  13. Photoshop调出田园照片唯美手绘油画效果
  14. uni-app双排一起滑动--两行同步滑动
  15. vscode 注释多行代码_如何在Visual Studio Code中注释多行?
  16. 重走来时路,这一次我会披荆斩棘
  17. sparksql读取数据过大报java.lang.OutOfMemoryError: Java heap space
  18. exe4j打成的exe文件运行时每次弹窗this executable was created with an evaluation version of exe4j
  19. Ubuntu18.04 更改GRUB引导菜单背景图片和默认启动项
  20. 基于Python/Capl脚本 对通信矩阵报文(Flexray/Can)的周期检测(二)

热门文章

  1. Linux平台下C++编程
  2. CDH 6.x 安装 Phoenix 服务
  3. Hbase Compaction 源码分析 - CompactSplitThread 线程池选择
  4. 今天的这个小成绩,需要向阿里云的朋友报告一下!
  5. 云上的Growth hacking之路,打造产品的增长引擎
  6. 阿里资深技术专家:优秀的数据库存储引擎应具备哪些能力?
  7. 从日志入手,保障 Kubernetes 稳定性
  8. 大数据给教育带来怎样的可能?
  9. 支持OpenStack,红帽将开源进行到底
  10. 红帽:将开源进行到底