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. Android内存管理之道
  2. 简单计算器的设计java_(基于java的简易计算器的设计.doc
  3. Qt5.15 连接MySQL数据库的实现策略
  4. SAP CRM和Cloud for Customer的UI界面皮肤更改
  5. 华为将升级鸿蒙,华为将弃用安卓?Mate40将成为首款可升级鸿蒙OS的手机
  6. Kindeditor放置两个调用readonly错误
  7. POJ 1836 Alignment
  8. WPF中设置了WindowStyle=None后,窗口仍然有边框的解决方法
  9. php设计是什么意思,php – 什么是更好的设计?
  10. 名词解释说明用英语怎么说_“恍然大悟”用英语怎么说?
  11. oracle dba (适用,OracleDBA笔试题
  12. Qt如何给一个button,悬浮 、按下设置不同的背景图
  13. 两种方法身份证读卡器对接,实现扫描身份证读取身份证信息功能。
  14. 使用激活工具后主页被篡改为hao123
  15. 全国计算机等级考试 二级C语言考前复习资料(笔试)
  16. nodejs实现单点登录系统
  17. selenium页面跳转问题-QQ邮箱登录之后找不到元素
  18. 碎碎念情境记忆法——最适合程序员的背单词方法
  19. 哈夫曼树和哈夫曼编码
  20. Java中的XML解析

热门文章

  1. Hbase二级索引+CDH+Lily
  2. 阿里云实时数仓Hologres年度发布,解读数仓新趋势
  3. 中邮智递通过数加和datav将系统和服务迁移到大数据平台
  4. 从电商到软件市场,阿里双11战火蔓延
  5. 在加州最古老的监狱教课是种什么样的体验?
  6. 专访阿里云专有云马劲,一个理性的理想主义者
  7. 【程序猿必备】数据结构与算法精选面试题
  8. 实现工具自由!开源的桌面工具箱
  9. WAIC|高精准、低成本,九章云极DataCanvas突破AutoML难题
  10. 山石网科发布重磅容器安全产品“山石云铠”,云安全版图再下一城