ddxiami

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 3007|回复: 4

[细说PHP] 第10章PHP面向对象的程序设计--封装性

[复制链接]
发表于 2013-8-5 17:18:37 | 显示全部楼层 |阅读模式
设置私有成员

<?php
        class Person  {                                 
                //下面是声明人的成员属性,全都使用了private关键字封装
                private $name;                                     //第一个成员属性$name定义人的名字,此属性被封装
                private $sex;                                      //第二个成员属性$sex定义人的性别,此属性被封装
                private $age;                                      //第三个成员属性$age定义人的年龄,此属性被封装

            function __construct($name="", $sex="男", $age=1) {
                        $this->name = $name;           
                        $this->sex = $sex;              
                        $this->age = $age;              
                }

                //在类中声明一个走路方法,调用两个内部的私有方法完成
                function run(){                     
                        echo $this->name."在走路时".$this->leftLeg()."再".$this->rightLeg()."<br>";       
                }
         
                //声明一个迈左腿的方法,被封装所以只能在内部使用
                private function leftLeg() {           
                        return "迈左腿";
                }
        
                //声明一个迈右腿的方法,被封装所以只能在内部使用
                private function rightLeg() {          
                        return "迈右腿";
                }
        }
        $person1 = new Person();                
       
        $person1->run();                               //run()的方法没有被封装,所以可以在对象外部使用
        $person1->name = "李四";                //name属性被封装,不能在对象外部给私有属性赋值
        echo $person1->age;                            //age属性被封装,不能在对象的外部获取私有属性的值
        $person1->leftLeg();                    //leftLeg()方法被封装,不能在对象外面调用对象中私有的方法
回复

使用道具 举报

 楼主| 发表于 2013-8-5 18:02:08 | 显示全部楼层
私有成员的访问

<?php
        class Person  {                           
                //下面是声明人的成员属性,全都使用了private关键字封装
                private $name;                       //第一个成员属性$name定义人的名字,此属性被封装
                private $sex;                         //第二个成员属性$sex定义人的性别,此属性被封装
                private $age;                         //第三个成员属性$age定义人的年龄,此属性被封装

            function __construct($name="", $sex="男", $age=1) {
                        $this->name = $name;   
                        $this->sex = $sex;              
                        $this->age = $age;              
                }
               
                //通过这个公有方法可以在对象外部获取私有属性$name的值
                public  function getName() {          
                        return $this->name;                              //返回对象的私有属性的值
                }
               
                //通过这个公有方法在对象外部为私有属性$sex设置值,但限制条件
                public function setSex($sex) {         
                        if($sex=="男" || $sex=="女")                 //如果传入合法的值才为私有的属性赋值
                                $this->sex=$sex;                                   //条件成立则将参数传入的值赋给私有属性
                }

                //通过这个公有方法在对象外部为私有属性$age设置值,但限制条件
                public function setAge($age) {        
                        if($age > 150 || $age <0)                          //如果设置不合理的年龄则函数不往下执行
                                return;                                            //返回空值,退出函数
                        $this->age=$age;                                 //执行此语句则重新为私有属性赋值
                }

                //通过这个公有方法可以在对象外部获取私有属性$name的值
                public function getAge(){           
                        if($this->age > 30)                               //如果年龄的成员属性大于30则返回虚假的年龄
                                return $this->age - 10;                 //返回当前的年龄减去10岁
                        else                                                   //如果年龄在30岁以下则返回真实年龄
                                return $this->age;                           //返回当前的私有年龄属性
                }

                //下面是声明人的成员公有方法,说出自己所有的私有属性
                function say(){                          
                        echo "我的名字:".$this->name.", 性别:".$this->sex.",年龄:".$this->age."。<br>";
                }               
        }
       
        $person1 = new Person("王五", "男", 40);        //创建对象$person1
       
        echo $person1->getName()."<br>";                          //访问对象中的公有方法,获取对象中私有属性$name输出
        $person1->setSex("女");                                    //通过公有的方法为私有属性$sex设置合法的值
        $person1->setAge(200);                                    //通过公有的方法为私有属性$age设置非法的值,赋值失败
        echo $person1->getAge()."<br>";                            //访问对象中的公有方法,获取对象中私有属性$age输出
        $person1->say();                                               //访问对象中的公有方法,获取对象中所有的私有属性并输出
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-6 13:24:54 | 显示全部楼层
魔术方法__set()

<?php
        class Person  {                                          
                //下面是声明人的成员属性,全都使用了private关键字封装
                private $name;                                     //此属性被封装
                private $sex;                                      //此属性被封装
                private $age;                                      //此属性被封装

            function __construct($name="", $sex="男", $age=1) {
                        $this->name = $name;                  
                        $this->sex = $sex;                     
                        $this->age = $age;                       
                }
               
                /**
                        声明魔术方法需要两个参数,直接为私有属性赋值时自动调用,并可以屏蔽一些非法赋值
                        @param        string        $propertyName                成员属性名
                        @param        mixed        $propertyValue        成员属性值
                */
                private function __set($propertyName, $propertyValue) {
                        //如果第一个参数是属性名sex则条件成立
                        if($propertyName == "sex"){        
                                //第二个参数只能是男或女
                                if(!($propertyValue == "男" || $propertyValue == "女"))
                                        //如果是非法参数返回空,则结束方法执行
                                        return;                       
                        }        
                        
                        //如果第一个参数是属性名age则条件成立
                        if($propertyName == "age"){   
                                //第二个参数只能在0到150之间的整数
                                if($propertyValue > 150 || $propertyValue <0)  
                                        //如果是非法参数返回空,则结束方法执行
                                        return;                  
                        }
            
                        //根据参数决定为那个属性被赋值,传入不同的成员属性名,赋上传入的相应的值
                        $this->$propertyName = $propertyValue;
                }
               
                //下面是声明人类的成员方法,设置为公有的可以在任何地方访问
                public function say(){
                        echo "我的名字:".$this->name.",性别:".$this->sex.",年龄:".$this->age."。<br>";
                }               
        }

        $person1 = new Person("张三", "男", 20);
        //以下三行自动调用了__set()函数,将属性名分别传给第一个参数,将属性值传给第二个参数
        $person1->name = "李四";                     //动调用了__set()方法为私有属性name赋值成功
        $person1->sex = "女";                         //动调用了__set()方法为私有属性sex赋值成功
        $person1->age = 80;                         //动调用了__set()方法为私有属性age赋值成功
        
        $person1->sex = "保密";                       //“保密”是一个非法值,这条语句给私有属性sex赋值失败
        $person1->age = 800;                         //800是一个非法值,这条语句私有属性age赋值失败

        $person1->say();                                   //调用$person1对象中的say()方法,查看一下所有被重新设置的新值

回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-6 13:25:36 | 显示全部楼层
魔术方法__get()

<?php
        class Person  {                                          
                private $name;                                       //此属性被封装
                private $sex;                                         //此属性被封装
                private $age;                                         //此属性被封装

            function __construct($name="", $sex="男", $age=1) {     
                        $this->name = $name;                 
                        $this->sex = $sex;                     
                        $this->age = $age;                              
                }
               
                /**
                        在类中添加__get()方法,在直接获取属性值时自动调用一次,以属性名作为参数传入并处理
                        @param        string        $propertyName                成员属性名
                        @return        mixed                                        返回属性值
                */
                private function __get($propertyName)  {          //在方法前使用private修饰,防止对象外部调用
                         if($propertyName == "sex") {                //如果参数传入的是”sex”则条件成立
                                return "保密";                                //不让别人获取到性别,以“保密”替代
                         } else if($propertyName == "age") {         //如果参数传入的是“age”则条件成立
                                if($this->age > 30)                            //如果对象中的年龄大于30时条件成立
                                        return $this->age-10;                    //返回对象中虚假的年龄,比真实年龄小10岁
                                else                                         //如果对象中的年龄不大于30时则执行下面代码
                                        return $this->$propertyName;          //让访问都可以获取到对象中真实的年龄
                         } else {                                    //如果参数传入的是其他属性名则条件成立
                                 return $this->$propertyName;              //对其他属性都没有限制,可以直接返回属性的值
                         }
                }
        }




        $person1 = new Person("张三", "男", 40);        
        
        echo "姓名:".$person1->name."<br>";           //直接访问私有属性name,自动调用了__get()方法可以间接获取
        echo "性别:".$person1->sex."<br>";            //自动调用了__get()方法,但在方法中没有返回真实属性值
        echo "年龄:".$person1->age."<br>";            //自动调用了__get()方法,根据对象本身的情况会返回不同的值
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-6 13:33:37 | 显示全部楼层
魔术方法__isset()和__unset()

<?php
        class Person  {                                   
                private $name;                                       //此属性被封装
                private $sex;                                         //此属性被封装
                private $age;                                         //此属性被封装

                function __construct($name="", $sex="男", $age=1) {
                        $this->name = $name;                           
                        $this->sex = $sex;                              
                        $this->age = $age;      
                }
               
                /**
                        当在对象外面使用isset()测定私用成员属性时,自动调用,并在内部测定扣传给外部的isset()结果
                        @param        string        $propertyName                成员属性名
                        @return        boolean                                        返回isset()查询成员属性的真假结果
                */
                private function __isset($propertyName) {        //需要一个参数,是测定的私有属性的名称
                        if($propertyName == "name")                      //如果参数中传入的属性名等于“name”时条件成立
                                return false;                               //返回假,不允许在对象外部测定这个属性
                        return isset($this->$propertyName);         //其他的属性都可以被测定,并返回测定的结果
                   }
               
                /**
                        当在对象外面使用unset()方法删除私用属性时,自动被调用,并在内部把私用的成员属性删除
                        @param        string        $propertyName                成员属性名
                */
                   private function __unset($propertyName) {        //需要一个参数,是要删除的私有属性名称
                        if($propertyName == "name")                       //如果参数中传入的属性名等于“name”时条件成立
                                return;                                            //退出方法,不允许删除对象中的name属性
                        unset($this->$propertyName);                     //在对象的内部删除在对象外指定的私有属性
                }

                public function say() {
                        echo "我的名字:".$this->name.",性别:".$this->sex.",年龄:".$this->age."。<br>";
                }               
        }

        $person1 = new Person("张三", "男", 40);                   //创建一个对象$person1,将成员属性分别赋上初值
       
        var_dump( isset( $person1->name ) );                //输出bool(false),不允许测定name属性
        var_dump( isset( $person1->sex ) );                  //输出bool(true),存在sex私有属性
        var_dump( isset( $person1->age ) );                  //输出bool(true),对象中存在age私有属性
        var_dump( isset( $person1->id ) );                   //输出bool(false),测定对象中不存在id属性
               
        unset( $person1->name );                                //删除私有属性name,但在__unset()中不允许删除
        unset( $person1->sex );                                  //删除对象中的私有属性sex,删除成功
        unset( $person1->age );                                  //删除对象中的私有属性age,删除成功
       
        $person1->say();          //对象中的sex和age属性被删除,输出:我的名字叫:张三,性别:,我的年龄是:
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|技术文档库 ( 闽ICP备15017263号-2 )|网站地图

GMT+8, 2025-5-18 22:20 , Processed in 0.039531 second(s), 20 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表