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. 应用Java泛型和反射导出CSV文件

    项目中有需求要把数据导出为CSV文件,因为不同的类有不同的属性,为了代码简单,应用Java的泛型和反射,写了一个函数,完成导出功能. public <T> void saveFile(Li ...

  2. [转]省市二级联动(纯js实现)

    转至:http://www.jb51.net/article/41556.htm 实现原理: set_city("省名称",市select对象); 判断市select对象是否为空, ...

  3. C++中标准容器Vector,元素操作.insert()小结

    insert() 函数有以下三种用法: iterator insert( iterator loc, const TYPE &val );  //在指定位置loc前插入值为val的元素,返回指 ...

  4. 如何使用C#去灰度化一幅图像

    灰度化一幅图像就是将图像的色彩信息全部丢掉,将24位的位图信息,用8位来表示,灰度图共有256级灰度等级,也就是将24位位图的一点如(255,255,255)转换成255,所以R,G,B三个值所乘的系 ...

  5. VS 2012单元测试和测试资源管理器

    时间:2012-08-27 17:29 来源:张善友 博客园 字体:[大 中 小] 现在您可以在您的项目当中自行选择 NUnit 或是 xUnit 之类的套件. 而且这次的测试资源管理器也完全以”信息 ...

  6. JdbcTemplate增删改查

    1.使用JdbcTemplate的execute()方法执行SQL语句 jdbcTemplate.execute("CREATE TABLE USER (user_id integer, n ...

  7. Ubuntu 12.04 中安装和配置 Java JDK

    先去 Oracle下载Linux下的JDK压缩包,我下载的是jdk-7u4-linux-i586.tar.gz文件,下好后直接解压 sudo mv ./jdk1.7.0_55 /usr/lib/jdk ...

  8. 微信公众平台Token验证失败的解决办法

    微信公众平台Token验证失败的解决办法 1.可查看url和token是否正确 2.查看服务器端口是否为80端口 3.你可以通过记录log日志来判断是否接受到微信提交过来的信息 1.$fp=fopen ...

  9. Displaying Alerts with UIAlertView

    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Alert" message:@"You've ...

  10. 使用安卓读取sqlite数据库方法记录

    最近要实现android读取sqlite数据库文件,在这里先做一个英汉字典的例子.主要是输入英语到数据库中查询相应的汉语意思,将其答案输出.数据库采用sqlite3. 如图: 实现过程完全是按照参考文 ...