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

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

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

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

延伸阅读

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/521705.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java.net.SocketException: 权限不够

java.net.SocketException: 权限不够 一切问题的根源都是缺乏常识 0.0… 背景:今天部署一个spring cloud服务,tanainaide 服务的端口为80,然后我建了个tomcat用户来启动,但是死活起不来,搞了好久还以为是环境问题都重…

人工智能让边缘计算更有价值!

摘要: 继云计算之后,边缘计算这把火你了解多少?来了解一下吧。3月28日,在2018云栖大会深圳峰会上,阿里云宣布2018年将战略投入到边缘计算技术领域,并推出了首个IOT边缘计算产品Link Edge,将阿里云在云计算、…

硬件测试工程师之EMC项目-电磁干扰-谐波测试的引文

1: 介绍EMC项目-谐波测试 1.1引入文章 硬件测试工程师所面对的测试产品,尤其对于EMC来说,测试的种类很多,都是电器居多,例如电磁炉,USB适配器,空调,开关驱动,智能挂壁式…

儿童节,5岁宝宝写给程序员爸爸的一封信!萌翻了!

摘要: 六一儿童节到了,云栖社区特别采访了几位可爱的宝宝,来分享他们眼中的程序员爸爸妈妈。六一儿童节到了,云栖社区特别采访了几位可爱的宝宝,来分享他们眼中的程序员爸爸妈妈。最后一位宝宝的回答,萌翻了…

外部jar包_大数据系列之PySpark读写外部数据库

本文以MySQL和HBASE为例,简要介绍Spark通过PyMySQL和HadoopAPI算子对外部数据库的读写操作1、PySpark读写MySQLMySQL环境准备参考“数据库系列之MySQL主从复制集群部署”部分1.1 PyMySQL和MySQLDB模块PyMySQL是在Python3.x版本中用于连接MySQL服务器的一个库&#x…

Vue + Spring Boot 项目实战(二):使用 CLI 搭建 Vue.js 项目

文章目录一、安装 Vue CLI二、构建前端项目2.1.创建一个基于 webpack 模板的项目2.2. 安装图解2.3. 项目结构总览2.4. 运行项目2.5. 浏览器验证项目GitHub 地址: https://github.com/Antabot/White-Jotter在动手操作之前,我希望大家已经清楚什么是 “前后…

人工智能与大数据的完美结合

摘要: 人工智能是一种在大数据世界中指引方向和获取规律的方法。人工智能(AI)已经存在几十年了。然而,最近随着“大数据”的出现,它得到了越来越多的关注。维基百科对人工智能的释义如下:在计算机科学中,人…

这本销量突破70W+的 Python 插画式书籍,凭什么这么火?

戳蓝字“CSDN云计算”关注我们哦!最近不管我在互联网看新闻、看视频或者看公众号文章,甚至我在淘宝的时候都会看到一个词,那就是“Python”,我也不知道我对它做了什么,为什么老是给我推送Python?甚至我和程…

【人脸识别终结者】多伦多大学反人脸识别,身份欺骗成功率达99.5%

摘要: 多伦多大学研究人员设计新算法,通过动态地干扰人脸识别工具来保护用户的隐私。结果表明,他们的系统可以将原本可检测到的人脸比例从接近100%降低到0.5%。在一些社交媒体平台,每次你上传照片或视频时,…

快速运行python虚拟环境_快速入门Python 最新最流行的pipenv虚拟环境

2018的PyCon把最新型最先进的Python虚拟环境pipenv吵得火热。看了下介绍感觉真的很好用,它在virtualenv的基础上包装了一些更便捷的功能,解决了很多很多virtualenv欠缺的事情。简单说,pipenv就是把pip和virtualenv包装起来的一个便携工具。它…

php中$stu_by,PHP基础案例二:计算学生年龄

一、需求分析为了方便、准确、快捷的展示学的年龄,系统通常根据学生的出生日期进行自动计算。下面请利用PHP变量分别保存学生的年月日,并通过PHP中的data函数获取当前年月日,最后计算出学生的年龄。例如:出生年月日为:…

1273 - Unknown collation: 'utf8mb4_0900_ai_ci'

使用navicate12运行sql文件出错 报错: [ERR] 1273 - Unknown collation: ‘utf8mb4_0900_ai_ci’ 1 报错原因: 生成转储文件的数据库版本为8.0,要导入sql文件的数据库版本为5.6,因为是高版本导入到低版本,引起1273错误 解决方法&#xff1…

iPhone11首批用户评价实属翻车现场;据悉,谷歌宣布投资30亿欧元扩大欧洲数据中心……...

关注并标星星CSDN云计算极客头条:速递、最新、绝对有料。这里有企业新动、这里有业界要闻,打起十二分精神,紧跟fashion你可以的!每周三次,打卡即read更快、更全了解泛云圈精彩newsgo go go 微软说:杀手机器…

阿里七层流量入口 Tengine硬件加速探索之路

摘要: Tengine在软件层面已经有了深度的调试和优化经验,但是在硬件层面,通用处理器(CPU)已经进入了摩尔定律,有了瓶颈。而在业务量突飞猛进的当下,如何利用硬件来提升性能,承载双11等…

新增16条设计规约!阿里巴巴Java开发手册(详尽版)开放下载!

摘要:2018年6月,《阿里巴巴Java开发手册》再次刷新代码规范认知,我们新增了16条设计规约!现免费开放下载,不可错过!《阿里巴巴Java开发手册》是阿里内部Java工程师所遵循的开发规范,涵盖编程规约…

重构碎片化知识_day22重构力-思维导图:让碎片化知识的零存整取

课程文稿你好,我是导图郡主潘宝苹。你是否每天通过微信群、朋友圈、各种头条、手机报、新闻网站等多种渠道获取信息。在吃饭时看手机,在坐公交车时刷微博,睡觉前还翻一翻好友的朋友圈不愿放下手机?我们生活在一个信息爆炸的年代&a…

受困于敏捷开发的数据与架构?肿么办?

戳蓝字“CSDN云计算”关注我们哦!译|Lorraine Lo文|Isaac Sacolick来源|InfoWorld网站如今企业强调敏捷开发不是一天两天,但在此过程中敏捷团队通常都会面临的一大挑战就是如何定义以及遵循开发中数据架构的模式和标准这一系列问题。人们之所以认为推动数…

Vue + Spring Boot 项目实战(三):使用IntelliJ IDEA快速生成 Vue.js 项目

文章目录一、使用idea Vue插件生成项目结构1.1. Create New Project1.2. 设置项目地址1.3. 确认项目名称1.4. 项目描述1.5. 作者信息1.6. 编译模板1.7. 安装路由二、安装node_modules模块三、启动项目四、Vue 项目结构分析4.1. 概览4.2. index.html4.3. App.vue4.4. main.js4.5…

沙漠种水稻,88岁的袁隆平又创造奇迹!他参与的“袁米”还有个大计划

摘要: 今年88岁的袁隆平说,他退休之前想看到两件事情:一件是杂交稻大面积亩产1200公斤,另一件是海水稻研发成功。 这几天,关于海水稻的话题再次成为热点。 上周,在两院院士大会上,海水稻和杂交水…

八年磨一剑,阿里云ApsaraDB for HBase2.0正式上线

摘要: ApsaraDB for HBase2.0于2018年6月6日即将正式发布上线啦! 它是基于社区HBase2.0稳定版的升级,也是阿里HBase多年的实践经验和技术积累的持续延伸,全面解决了旧版本碰到的核心问题,并做了很多优化改进&#xff0…