php获得对象的类型,php 类型(对象)提示

PHP面向对象:类型提示

2010-07-06

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

没有类型提示很危险

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

01

02

class NormalUser{

03

/*

04

* 其它相关代码..省略........

05

*/

06

private $age;

07

public function setAge($_age){

08

$this->age =$_age;

09

}

10

public function getAge(){

11

return $this->age ;

12

}

13

}

14

15

$normalUser =new NormalUser();

16

$normalUser->setAge("I am tom");//这里我们传输一个非数值.

17

echo "age is " .$normalUser->getAge();

18

19

//注意输出结果不是我想要的类型.

20

?>

程序运行结果:

1

age is I am tom

原始类型的类型判断

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

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

于是代码有了修改:

01

02

class NormalUser{

03

/*

04

* 其它相关代码..省略........

05

*/

06

private $age;

07

public function setAge($_age){

08

if(is_numeric($_age)){

09

$this->age =$_age;

10

}

11

}

12

public function getAge(){

13

return $this->age ;

14

}

15

}

16

17

$normalUser =new NormalUser();

18

$normalUser->setAge("I am tom");//这里我们传输一个非数值.

19

echo "age is " .$normalUser->getAge();//看到这里的结果为空.

20

echo  "
";

21

$normalUser->setAge("100");

22

echo "age is ".$normalUser->getAge();// 这里就有了结果.

23

?>

程序运行结果:

1

age is

2

age is 100

向方法内传递对象

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

01

02

class NormalUser {

03

private $name;

04

public function setName($_name){

05

$this->name =$_name;

06

//这里有存入数据库等等代码....

07

}

08

public function getName(){

09

return $this->name;

10

}

11

}

12

13

class UserAdmin{

14

//这里定义的参数,第一个是User类的实例,第二是要设置的名字.

15

public static function changeName($_user,$_name){

16

$_user->setName($_name);

17

}

18

}

19

20

$normalUser =new NormalUser();

21

UserAdmin::changeName($normalUser,"Tom");

22

echo "userName is " .$normalUser->getName();

23

24

?>

程序运行结果:

1

userName is Tom

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

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

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

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

01

02

class NormalUser{

03

private $name;

04

public function setName($_name){

05

$this->name =$_name;

06

}

07

public function getName(){

08

return $this->name;

09

}

10

}

11

12

class Book{

13

private $bookName;

14

public function setName($_name){

15

$this->bookName =$_name;

16

}

17

public function getName(){

18

return $this->bookName;

19

}

20

}

21

22

class UserAdmin{

23

public static function changeName($_user,$_name){

24

$_user->setName($_name);

25

}

26

}

27

28

$book =new Book();

29

UserAdmin::changeName($book,"Tom");

30

echo "bookName is " .$book->getName();

31

32

?>

程序运行结果:

1

bookName is Tom

类型提示保障数据安全

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

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

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

01

02

class NormalUser {

03

private $name;

04

public function setName($_name){

05

$this->name =$_name;

06

}

07

public function getName(){

08

return $this->name;

09

}

10

}

11

12

class UserAdmin{

13

public static function changeName(NormalUser$_user,$_name){

14

$_user->setName($_name);

15

}

16

}

17

UserAdmin::changeName("anyType","Tom");

18

?>

程序运行结果:

1

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 221and defined in E:\PHPProjects\NowaMagic\php\php_TypeTips.php on line 217

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

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

原文(http://www.nowamagic.net/php/php_TypeTips.php)

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

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

相关文章

2016 - 2 - 20 ARC知识总结(二 autorelease概念及实现)

首先祝自己生日快乐~23咯~ 一 autorelease的概念 autorelease会像C语言的自动变量那样来对待对象实例。当超出作用域(相当于变量作用域)时,对象的实例release实力方法被调用。 另外,同C语言的自动变量不同的是,编程人员可以自己设置变量的作…

iphone屏蔽系统更新_iOS13屏蔽系统更新升级教程

好消息 !今天开始可以安装 tvOS13 屏蔽系统升级描述文件了。说起系统屏蔽更新,以前都是利用 tvOS描述文件去屏蔽系统更新,如果你之前有使用过它,你应该知道,一旦安装了,在软件更新就会显示当前系统为最新&a…

oracle批量生成索引,ORACLE迁移时批量导出索引、存储过程,表结构等

[toc]ORACLE迁移中的一些经验(一)批量导出sequence批量导出squence在网上找到这样一条语句:select create sequence || sequence_name || minvalue || min_value || maxvalue || max_value || start with || last_number || increment by || increment_by ||…

myeclipse 怎么安装与激活

摘录自:http://blog.csdn.net/u012318074/article/details/71310553 第一步:安装完成后不要运行MyEclipse 第二步:下载对应的破解文件 第三步:解压并打开破解文件 第四步:打开文件夹patch,将里面的文件全部…

oracle insert select 大 批量 数据_芬兰 Vaisala维萨拉 HM70手持式温湿度表 型号:FL15/HM70+HMP75【北京中西华大吧】...

陈经理18910282263芬兰 Vaisala维萨拉 HM70手持式温湿度表 型号:FL15/HM70HMP75库号:M72537 相对湿度测量范围 0…100 % RH多种语言用户界面显示图形趋势维萨拉HUMICAP 传感器技术3个探头, 温度范围-70 至180 C湿度探头、露点探头和二氧化碳探头均可连接显示多种湿度…

android.hardware.Camera类及其标准接口介绍

android.hardware.Camera类及其标准接口介绍,API level 19 http://developer.android.com/reference/android/hardware/Camera.html转载于:https://www.cnblogs.com/zl1991/p/5203504.html

c++思维导图_必看|用好思维导图,别神话思维导图

不知不觉,时间已经划至5月中旬,20级的萌新们也从当初的“小白”不断进阶,化身老司机指日可待~相信从备考到现在,各位一定对“思维导图”这四个大字都听倦了!不管是老学长老学姐们公开课上传授的经验,还是刚…

oracle 性能优化 常用,Oracle數據庫常用性能優化

1、 查兩張以上表時,把記錄少的放在右邊2、 WHERE子句中的連接順序ORACLE采用自上而下的順序解析WHERE子句,根據這個原則,那些可以過濾掉最大數量記錄的條件應寫在WHERE子句最后。例如:查詢員工的編號,姓名,工資,部門名…

如何在cmd命令行中查看、修改、删除与添加环境变量

首先明确一点: 所有的在cmd命令行下对环境变量的修改只对当前窗口有效,不是永久性的修改。也就是说当关闭此cmd命令行窗口后,将不再起作用。永久性修改环境变量的方法有两种:一种是直接修改注册表(此种方法目前没试验过…

linux进程实际内存大小,Linux进程内存用量分析之堆内存篇

本文将介绍几种内存泄漏检测工具,并通过实际例子介绍一种分析堆内存占用量的工具和方法,帮助定位内存膨胀问题。背景进程的内存管理是每一个开发者必须要考虑的问题,对于C程序进程来说,出现问题很多情况下都与内存挂钩。进程崩溃问…

spring处理循环依赖时序图_Maven依赖管理系统

【思考】首先,简单讲述一下为什么需要这样一个系统?不知道大家有没有思考,在一个可能有上千个模块/产品的公司,对于模块之间有较多相互依赖的情况,以下问题该如何解决:我们把一个生命周期结束的组件移除之后…

好友消息和群消息区别

好友消息类型&#xff1a;$message is 空军建军节群消息类型: $message is 33623fd04e4001687be9b5d85b1e2958950adc947c2398c59225d8904ff98bea:<br/>hhhgf转载于:https://www.cnblogs.com/zhaoyangjian724/p/6200407.html

linux入门命令菜鸟,经典:Linux菜鸟入门级命令大全

经典&#xff1a;Linux菜鸟入门级命令大全1. man 对你熟悉或不熟悉的命令提供帮助解释eg:man ls 就可以查看ls相关的用法注&#xff1a;按q键或者ctrlc退出&#xff0c;在linux下可以使用ctrlc终止当前程序运行。2. ls 查看目录或者文件的属*&#xff0c;列举出任一目录下面的文…

java 获取本机ip_linux获取本机IP

获取网口名称直接输出所有的网口信息ifconfig | grep -v ^ | grep -v ^bashifconfig | awk -F: /^[^ ]/{print$1}ip a | awk -F": " /^[^ ]/{print$2}获取所有的IP直接输出所有的IPifconfig | grep inet | awk {print $2}ip a | awk /inet /{print$2} | sed s#/.*#…

python语言基本控制结构有哪些-以下不属于Python语言控制结构的是()

【单选题】以下程序的输出结果是() x10 y0 if(x>5)or(x/y>5): print("Right") else: print("Wrong")(1.0分) 【单选题】以下代码的输出结果是() def young(age): if 25<age<30: print("年轻有前途") elif age<25: print("参…

手持移动扫描终端 PDA移动开单系统-批发零售管理

条码数据采集器通过扫描商品条码移动开单&#xff0c;实现便携式办公&#xff0c;伴随式销售&#xff0c;是我公司的一款最新便携式开单配套产品&#xff0c;采集器能通过WIFI无线局域网、GPRS互联网直接与主机连接&#xff0c;让公司业务人员能随时随地了解公司产品信息&#…

Linux 把文件内容发送给用户,linux上给其他在线用户发送信息(wall, write, talk, mesg)...

linux上给其他在线用户发送信息(wall, write, talk, mesg)2018-11-30设置登录提示/etc/motd文件的用途/etc/motd即message of today(布告栏信息)&#xff0c;每次用户登录时&#xff0c;/etc/motd文件的内容会显示在用户的终端。系统管理员可以在文件中编辑系统活动消息&#x…

sd卡测速工具_拍完照回家发现SD卡损坏,拯救你的照片就用这个办法!

SD卡可以说是目前相机存储的主要工具&#xff0c;一旦拍照结束后出了问题&#xff0c;那可是最头疼的事情。我昨天就碰到了这样奇怪的事情&#xff0c;拍照回来正要导出数据&#xff0c;发现电脑系统提示要格式化存储卡&#xff0c;经过几次插拔发现依然不能识别。如果按照提示…

linux中vim如何替换字符串,vim中替换字符串的方法有哪些

vim中替换字符串的方法有哪些发布时间&#xff1a;2020-06-04 11:41:18来源&#xff1a;亿速云阅读&#xff1a;238作者&#xff1a;Leah这篇文章为大家带来有关vim中替换字符串的方法介绍&#xff0c;如果在日常学习或工作遇到这个问题&#xff0c;希望大家通过这篇文章的几种…

ELK Stack (1) —— ELK + Redis安装

ELK Stack (1) —— ELK Redis安装 摘要 安装Elasticsearch、Logstash、Kibana与Redis以实现一个日志收集平台 版本 elasticsearch版本: elasticsearch-2.2.0 logstash版本: logstash-2.2.2 kibana版本: kibana-4.3.1-darwin-x64 jdk版本: jdk1.8.0_65 内容 目标架构 Logstash…