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
建议在定义方法参数时,要使用类型提示。
如果类型不是对象,要采用代码进行类型建议,以增强安全性。
延伸阅读
此文章所在专题列表如下:
php 显示对像编码,PHP面向对象之旅:类型提示相关推荐
- 《大话Java性能优化》面向对象及基础类型相关部分
3.1 面向对象及基础类型 3.1.1 采用Clone()方式创建对象 Java语言里面的所有类都默认继承自java.lang.Object类,在java.lang.Object类里面有一个clone ...
- 矢量数编码有哪几种类型_6种最理想的编码工作(以及吸引每个人的类型)
矢量数编码有哪几种类型 by David Venturi 大卫·文图里(David Venturi) 6种最理想的编码工作(以及吸引每个人的类型) (The 6 most desirable codi ...
- mysql存json将utf8编码 去掉,MySQL对JSON类型UTF-8编码导致中文乱码探讨
原文:https://www.cnblogs.com/CreateMyself/p/12587426.html 前言 继上文发表之后,结合评论意见并亲自验证最终发现是编码的问题,但是对于字符编码还是有 ...
- Java黑皮书课后题第4章:*4.15(电话键盘)电话上的国际标准字母/数字映射如下所示。编写程序,提示用户输入一个小写或大写字母,然后显示对应数字。对于非字母输入,提示非法输入
*4.15(电话键盘)电话上的国际标准字母/数字映射如下所示.编写程序,提示用户输入一个小写或大写字母,然后显示对应数字.对于非字母输入,提示非法输入 题目 题目概述 运行示例 破题 代码 题目 题目 ...
- Java黑皮书课后题第2章:2.18(打印表格)编写程序,显示下面的表格,将浮点数值类型转化为整数
2.18(打印表格)编写程序,显示下面的表格,将浮点数值类型转化为整数 题目 题目描述 代码 方法评价 化繁为简:强制(数据)类型转换 题目 题目描述 2.18(打印表格)编写程序,显示下面的表格,将 ...
- 谷歌编码_如何通过学习编码赢得Google之旅
谷歌编码 by MaskyS 通过MaskyS 如何通过学习编码赢得Google之旅 (How I won a trip to Google by learning to code) 设置场景 (Se ...
- JavaScript面向对象之Object类型
大家都知道对象都是属于Object类型的.下面是一些详细总结,希望可以帮助到有需要的小伙伴. JavaScript面向对象之Object类型 在JS中所有的对象都拥有同一个父级,就是Object. O ...
- JavaScript面向对象之Function类型
JavaScript面向对象之Function类型 下面是我对Function类型的总结,希望对您有帮助. "函数式编程"是一种"编程范式"(programmi ...
- 改变ubuntu终端显示语言(桌面系统是中文,终端提示是英文)
一,永久有效: 1.打开终端: vi .bashrc 2.最后添加: if [ "$TERM"="linux" ] ;then export LANGU ...
最新文章
- 在家想远程公司电脑?Python +微信一键连接
- Zynq的AMP开发注意事项之sdk_repo
- TypeScript—快速入门
- php网页多个倒计时,怎么实现一个页面有多个倒计时同时进行
- promise.all_所有您需要了解的Promise.all
- andriod开发增加一个菜单
- IPLATUI----GRID状态
- ChannelOption.TCP_NODELAY, true-浅谈tcp_nodelay的作用
- 多次字符串相加一定要用StringBuilder而不用 + 吗?
- Unity3D开发资料
- 2019西湖论剑网络安全技能大赛(大学生组)部分WriteUp
- 计算机相关常数,地址常数
- Photoshop调出田园照片唯美手绘油画效果
- uni-app双排一起滑动--两行同步滑动
- vscode 注释多行代码_如何在Visual Studio Code中注释多行?
- 重走来时路,这一次我会披荆斩棘
- sparksql读取数据过大报java.lang.OutOfMemoryError: Java heap space
- exe4j打成的exe文件运行时每次弹窗this executable was created with an evaluation version of exe4j
- Ubuntu18.04 更改GRUB引导菜单背景图片和默认启动项
- 基于Python/Capl脚本 对通信矩阵报文(Flexray/Can)的周期检测(二)