zoukankan      html  css  js  c++  java
  • 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 "<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:PHPProjectsNowaMagicphpphp_TypeTips.php on line 221 and defined in E:PHPProjectsNowaMagicphpphp_TypeTips.php on line 217

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

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

  • 相关阅读:
    Hdu 5396 Expression (区间Dp)
    Lightoj 1174
    codeforces 570 D. Tree Requests (dfs)
    codeforces 570 E. Pig and Palindromes (DP)
    Hdu 5385 The path
    Hdu 5384 Danganronpa (AC自动机模板)
    Hdu 5372 Segment Game (树状数组)
    Hdu 5379 Mahjong tree (dfs + 组合数)
    Hdu 5371 Hotaru's problem (manacher+枚举)
    Face The Right Way---hdu3276(开关问题)
  • 原文地址:https://www.cnblogs.com/zhengyanbin2016/p/6006713.html
Copyright © 2011-2022 走看看