• 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

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

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

  • 相关阅读:
    第二阶段团队站立会议06
    第二阶段团队站立会议05
    Spring
    JVM
    线程池
    java内存模型
    线程
    接口与抽象类
    动态绑定,多态,static
    同步异步,并发并行概念的理解
  • 原文地址:https://www.cnblogs.com/zhengyanbin2016/p/6006713.html
Copyright © 2020-2023  润新知