设为首页 收藏本站
查看: 920|回复: 0

[经验分享] PHP下的魔术方法的总结

[复制链接]

尚未签到

发表于 2015-8-25 12:09:20 | 显示全部楼层 |阅读模式
  
__construct>>

  构造方法: 在PHP中的构造方法要求不能进行构造方法的重载,即构造 方法只有一个.
  




    function __construct($name="宋", $sex="", $age=1) {  //构造方法在对象诞生时为成员属性赋初值
            $this->name=$name;
            $this->sex=$sex;
            $this->age=$age;
        }
说明: 1. 在一个类中,它只可能有一个构造方法.
      2. 所默认的构造方法是public的,如果使用private的话,则会构成单例模式.

  
  
  
  


DSC0000.gif DSC0001.gif __set方法来设置



__set()方法:这个方法用来为私有成员属性设置值的,有两个参数,第一个参数为你要为设置值的属性名,第二个参数是要给属性设置的值,没有返回值。
这个方法同样不用我们手工去调用,它也可以做成私有的,是在直接设置私有属性值的时候自动调用的,同样属性私有的已经被封装上
了,如果没有__set()这个方法,是不允许的,比如:$this->name=‘zhangsan’,这样会出错,但是如果你在类里面加上了__set($property_name, $value)这个方法,
在直接给私有属性赋值的时候,就会自动调用它,把属性比如name传给$property_name,把要赋的值“zhangsan”传给$value,通过这个方法的执行,达到赋值的目的。
如果成员属性不封装成私有的,对象本身就不会去自动调用这个方法。为了不传入非法的值,还可以在这个方法给做一下判断。
比如实例:

  
  
  


相应的实例
        private $name;       //第一个成员属性$name定义人的名子,此属性被封装
        private $sex;         //第二个成员属性$sex定义人的性别,此属性被封装
        private $age;         //第三个成员属性$age定义人的年龄,此属性被封装



//声明魔术方法需要两个参数,真接为私有属性赋值时自动调用,并可以屏蔽一些非法赋值
        private function __set($propertyName, $propertyValue) {
         
          if($propertyName=="sex"){        //如果第一个参数是属性名sex则条件成立
                //对于非法数据的处理
                if(!($propertyValue == "男" || $propertyValue == "女"))  //第二个参数只能是男或女
                    return;                //如果是非法参数返回空,则结束方法执行
            }   

            if($propertyName=="age"){        //如果第一个参数是属性名age则条件成立
                if($propertyValue > 150 || $propertyValue <0)  //第二个参数只能在0到150之间的整数
                    return;                //如果是非法参数返回空,则结束方法执行
            }
          //对于不需要进行验证的数据,根据参数决定为那个属性被赋值,传入不同的成员属性名,赋上传入的相应的值,定义赋值的方式.
            $this->$propertyName = $propertyValue;
        }
如调用时:
     $person1=new Person("张三", "男", 20);
    //自动调用了__set()函数,将属性名name传给第一个参数,将属性值”李四”传给第二个参数
    $person1->name="李四";      当进行赋值时,它会调用__set中的 $this->propertyName=$propertyValue代码
  
  
  __get()方法:这个方法用来获取私有成员属性值的,有一个参数,参数传入你要获取的成员属性的名称,返回获取的属性值,这个方法不用我们手工的去调用,因为我们也可以把这个方法做成私有的方法,是在直接获取私有属性的时候对象自动调用的。
  


get方法

//在类中添加__get()方法,在直接获取属性值时自动调用一次,以属性名作为参数传入并处理
        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;      //对其它属性都没有限制,可以直接返回属性的值
             }
        }

说明:1.它只有一个参数.就是属性名.
     2.这里的关键代码 return $this->$propertyName,即为真正得到属性值的代码.
如代码:
    $person1=new Person("张三", "男", 40);  
    echo "姓名:".$person1->name."<br>";   它会自动的调用,特别是__get()方法中的$person1即为$this.





  >>>

关于__isset()以及__unset()函数引入的意义与作用【PHP不是已经提供了unset和isset两个函数吗?】
__isset()方法: isset()是测定变量是否设定用的函数,传入一个变量作为参数,如果传入的变量存在则传回true,否则传回false。




那么如果在一个对象外面使用“isset()”这个函数去测定对象里面的成员是否被设定可不可以用它呢?
分两种情况,如果对象里面成员是公有的,我们就可以使用这个函数来测定成员属性,如果是私有的成员属性,这个函数就不起作用了,原因就是因为私有的被封装了,在外部不可见。
则就只能使用__isset魔术方法来完成.


同样,对于__unset的使用也一样.


__isset与__unset两个函数的应用



//__isset()方法
private function__isset($nm)
{
echo"isset()函数测定私有成员时,自动调用<br>";
return isset($this->$nm);                 这里所测试的结果为true或者是false
}
//__unset()方法
private function__unset($nm)
{
echo"当在类外部使用unset()函数来删除私有成员时自动调用的<br>";
unset($this->$nm);
}
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-104008-1-1.html 上篇帖子: php函数substr_replace中文乱码的替代解决方法 下篇帖子: php 30秒超时的限制解决办法!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

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