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