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 "<br>";

$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面向对象:类型提示的更多相关文章

  1. PHP 进阶篇:面向对象的设计原则,自动加载类,类型提示,traits,命名空间,spl的使用,反射的使用,php常用设计模式 (麦子学员 第三阶段)

    以下是进阶篇的内容:面向对象的设计原则,自动加载类,类型提示,traits,命名空间,spl的使用,反射的使用,php常用设计模式 ================================== ...

  2. 深入理解PHP内核(十)变量及数据类型-类型提示的实现

    原文链接:http://www.orlion.ga/253/ PHP是弱类型语言,向方法传递参数时也并不严格检查数据类型.不过有时候需要判断传递到方法中的参数,为此PHP中提供了一些函数来判断数据的类 ...

  3. php传入对象时获得类型提示

    类的类型提示 - 将类名放在需要约束的方法参数之前 语法格式: public function write(ShopProduct $shopProduct){} 数组提示: public funct ...

  4. 全面理解Python中的类型提示(Type Hints)

    众所周知,Python 是动态类型语言,运行时不需要指定变量类型.这一点是不会改变的,但是2015年9月创始人 Guido van Rossum 在 Python 3.5 引入了一个类型系统,允许开发 ...

  5. Python -类型提示 Type Hints

    为什么会有类型提示 Python是一种动态类型语言,这意味着我们在编写代码的时候更为自由,运行时不需要指定变量类型 但是与此同时 IDE 无法像静态类型语言那样分析代码,及时给我们相应的提示,比如字符 ...

  6. Python - typing 模块 —— 常用类型提示

    前言 typing 是在 python 3.5 才有的模块 前置学习 Python 类型提示:https://www.cnblogs.com/poloyy/p/15145380.html 常用类型提示 ...

  7. Python Type Hints(类型提示)

    在做自动化测试的时候,改进测试框架,类型提示会让你写代码时更加流程,当你在一个模块定义了类型,而其他模块没有提示的时候,是相当不方便.

  8. python进阶(21)typing模块--类型提示支持

    typing介绍   Python是一门弱类型的语言,很多时候我们可能不清楚函数参数的类型或者返回值的类型,这样会导致我们在写完代码一段时间后回过头再看代码,忘记了自己写的函数需要传什么类型的参数,返 ...

  9. Python 类型提示简介

    Python 3.6+ 版本加入了对"类型提示"的支持. 这些"类型提示"是一种新的语法(在 Python 3.6 版本加入)用来声明一个变量的类型. 通过声明 ...

随机推荐

  1. AutoCAD.NET二次开发:创建自定义菜单的两种方法比较

    目前我已经掌握的创建CAD菜单方法有两种: COM方式: http://www.cnblogs.com/bomb12138/p/3607929.html CUI方式: http://www.cnblo ...

  2. CodeForces 589I Lottery (暴力,水题)

    题意:给定 n 和 k,然后是 n 个数,表示1-k的一个值,问你修改最少的数,使得所有的1-k的数目都等于n/k. 析:水题,只要用每个数减去n/k,然后取模,加起来除以2,就ok了. 代码如下: ...

  3. 求一列的和,awk和perl哪个快?

    下午和群里的朋友争论了一下,有关awk和perl处理文本的速度,自己一直比较推崇perl,对awk知之甚少,结果就想当然的觉得perl快,结果一番争吵后,觉得还是实验一下靠谱,(其实是想证明一下per ...

  4. union all 简单用法

    select Y.ID,sum(cast(Y.m as int)) as hefrom(select top 10 a.ID,a.AlarmSource as m from dbo.AlarmInfo ...

  5. MongoDB 快速入门--中级

    索引 ensureIndex 用来创建索引,需要注意的就是一个集合最多也就64个索引 如果没加所有就是表扫表,速度很慢, 当然如果索引的键有多个,就必须考虑顺序 拓展索引 同样的也可以为内嵌文档 建立 ...

  6. Python 类型的分类

    1.存储模型,对象可以保存多少个值.如果只能保存一个值,是原子类型.如果可以保存多个值,是容器类型.数值是原子类型,元组,列表,字典是容器类型.考虑字符串,按道理,字符串应该是容器类型,因为它包含多个 ...

  7. Codeforces Round #276 (Div. 1) B. Maximum Value 筛倍数

    B. Maximum Value Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/484/prob ...

  8. BZOJ 3505: [Cqoi2014]数三角形 数学

    3505: [Cqoi2014]数三角形 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/pr ...

  9. key 限制字符的输入

    //限制字符的输入 { 只能输入以下字符 } procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);begin  If (Key ...

  10. 用adb pull命令从android系统中读取文件失败的原因及解决办法

    问题:使用adb pull命令从android系统中读取文件失败.显示:Permission denied   原因:是由于文件权限原因引起.       使用ls -l命令查看android系统中的 ...