PHP 魔术方法 _set __get __unset __isset

MethodExplain
__get__get( $property ) 当调用一个未定义的属性时访问此方法
__set__set( property, value ) 给一个未定义的属性赋值时调用
__isset__isset( $property ) 当在一个未定义的属性上调用isset()函数时调用此方法
__unset__unset( $property ) 当在一个未定义的属性上调用unset()函数时调用此方法
__call__call( method, arg_array ) 当调用一个未定义的方法是调用此访求
__autoload__autoload 函数,它会在试图使用尚未被定义的类时自动调用。通过调用此函数,脚本引擎在 PHP 出错失败前有了最后一个机会加载所需的类。注意: 在 __autoload 函数中抛出的异常不能被 catch 语句块捕获并导致致命错误。
__construct__construct 构造方法,当一个对象创建时调用此方法,使用此方法的好处是:可以使构造方法有一个独一无二的名称,无论它所在的类的名称是什么.这样你在改变类的名称时,就不需要改变构造方法的名称
__destruct__destruct 析构方法,PHP将在对象被销毁前(即从内存中清除前)调用这个方法
__clone如果在对象复制需要执行某些初始化操作,可以在__clone方法实现
__toString__toString方法在将一个对象转化成字符串时自动调用,比如使用echo打印对象时如果类没有实现此方法,则无法通过echo打印对象,否则会显示:Catchable fatal error: Object of class test could not be converted to string in此方法必须返回一个字符串
__sleep使用 __sleep 的目的是关闭对象可能具有的任何数据库连接,提交等待中的数据或进行类似的清除任务。此外,如果有非常大的对象而并不需要完全储存下来时此函数也很有用。
__wakeup使用 __wakeup 的目的是重建在序列化中可能丢失的任何数据库连接以及处理其它重新初始化的任务。
__invoke当尝试以调用函数的方式调用一个对象时,__invoke 方法会被自动调用。
__callStatic它的工作方式类似于 __call() 魔术方法,__callStatic() 是为了处理静态方法调用

<?php
    header("Content-Type: text/html; charset=utf-8");
    /*** 
    魔术方法:是指某些情况下,会自动调用的方法,称为魔术方法  
    PHP面向对象中,提供了这几个魔术方法,他们的特点 都是以双下划线__开头的
    __construct()     :构造方法,函数创建一个新的 SimpleXMLElement 对象
    __call()          :监视一个对象中的其它方法
    __callStatic()    :处理静态方法调用
    __get()           :当调用一个未定义的属性时访问此方法
    __set()           :给一个未定义的属性赋值时调用
    __isset()         :当在一个未定义的属性上调用isset()函数时调用此方法
    __unset()         :当在一个未定义的属性上调用unset()函数时调用此方法
    __sleep()         :关闭对象可能具有的任何数据库连接,提交等待中的数据或进行类似的清除任务
    __wakeup()        :重建在序列化中可能丢失的任何数据库连接以及处理其它重新初始化的任务
    __toString()      :将一个对象转化成字符串时自动调用,比如使用echo打印对象时,此方法必须返回一个字符串
    __invoke()        :当尝试以调用函数的方式调用一个对象时,__invoke 方法会被自动调用。
    __set_state()     :当调用var_export()时,这个静态 方法会被调用(唯一参数是一个数组)
    __clone()         :克隆方法,当对象被克隆时,将会自动调用  
    __destruct        :析构方法  
    ***/    
    class Human {   
        public $age = 22;   
        public function __clone() {   
        echo '有人克隆我!假冒';   
        }   
    }   
    $lisi = new Human();   
    $zhangsan = clone $lisi;   

    /* 
    結果: 有人克隆我!假冒 
    */  
?>  

<?php
    header("Content-Type: text/html; charset=utf-8"); 
    /**
    * 
    */
    class ClassName
    {
        public $name="kag";
        public $age="20";

        public function getName(){
            return $this->name;
        }

        public function setName($name){
            $this->name=$name;
        }

        public function getAge(){
            return $this->age;
        }

        public function setAge($age){
            $this->age=$age;
        }

        function __clone()
        {

            echo $this->name."<br>".$this->age;
        }
    }

    $classK=new ClassName;
    $zhangsan = clone $classK;
    $classK->setName("JACK");
    $classK->setAge("25");
    echo $classK->getName();
    echo $classK->getAge();

    echo $zhangsan->getName();
    echo $zhangsan->getAge();

?>  

<?php
    header("Content-Type: text/html; charset=utf-8"); 
    /**
    * 
    */
    class Human
    {
        private $money = '30两';   
        protected $age = 23;   
        public $name = 'lily';   
        public function __get($anyVariable) {   
            echo '你想访问我的',$anyVariable,'属性<br/>';   
        } 
    }

    $lily = new Human();   
    echo $lily->name."<br>"; 
    echo $lily->age."<br>"; 
    echo $lily->money."<br>"; 
    echo $lily->friend."<br>"; 
?>  
<?php
    header("Content-Type: text/html; charset=utf-8"); 
    /**
    * 
    */
    class Human
    {
        private $money = '30两';   
        protected $age = 23;   
        public $name = 'lily';   
        public function __get($anyVariable) {   
            echo '你想访问我的',$anyVariable,'属性<br/>';   
        } 
    }

    $lily = new Human();   
    echo $lily->name."<br>"; 
    echo $lily->age."<br>"; 
    echo $lily->money."<br>"; 
    echo $lily->friend."<br>"; 

    $lily->aaa="2222";
    $lily->bbb="3333";
    print_r($lily);


?>  
lily
你想访问我的age属性

你想访问我的money属性

你想访问我的friend属性

Human Object ( [money:Human:private] => 30两 [age:protected] => 23 [name] => lily [aaa] => 2222 [bbb] => 3333 ) 

//属性竟然加上了,说明了,这个猪,他就是个容器,你喂啥他吃啥。但是私有变量不会赋值,这点和其他语言相同

<?php
    header("Content-Type: text/html; charset=utf-8"); 
    /**
    * 
    */
    class Human
    {
        public $leg = 4;   
        protected $bone = '猪腿骨';   
        public function __isset($p) {   
            echo '你想判断我的',$p,'属性存不存在<br />';   
            return 1;   
        }   
        public function __unset($p) {   
            echo '你想去掉我的',$p,'?!<br />';   
        }   
    }

    $human1=new Human();
    print_r($human1);
    echo "<br>";

    if (isset($human1->leg)) {
        echo "存在する";
    }


?>  

<?php
    header("Content-Type: text/html; charset=utf-8"); 
    /**
    * 
    */
    class Sport 
    {
        public function mySport()
        {
            echo "调用方法存在,执行此方法<br>";
        }

        public function __call($method,$parameter)
        {
            echo "该方法不存在调用__call方法<br>";
            echo "方法名为:",$method,"<br>";
            echo "参数为:";
            var_dump($parameter);
        }
    }

    $kk=new Sport();
    $kk->mySport();
    echo "--------------------------------------------------<br>";
    $kk->mySport("kkk","mmmm","ppp");
    echo "--------------------------------------------------<br>";
    $kk->mmmmmm("kkk","mmmm","ppp");

?>  
调用方法存在,执行此方法
--------------------------------------------------
调用方法存在,执行此方法
--------------------------------------------------
该方法不存在调用__call方法
方法名为:mmmmmm
参数为:array(3) { [0]=> string(3) "kkk" [1]=> string(4) "mmmm" [2]=> string(3) "ppp" } 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值