object基础魔术方法使用代码

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
</head>
<body>


<?php
class MoShu{
    public $num1;
    private $num2;
    private $age;
    //__set方法没有定义相当于不存在
    //__set方法格式比较固定,必须工有的public,参数必须有两个
    //第一个参数:属性名称(字符串格式);第二个参数:属性的值
    public function __set($name,$value){
//        echo'<br>无法直接调用的属性:'.$name;
        //property_exists判断类当中是否有某个名称属性存在
        if(property_exists($this,$name)){
            $this->$name=$value;
        }else{
            echo'没有对应的属性:'.$name.'<br>';
        }
    }
    //__get方法格式也是固定的,必须有一个参数
    //需要提取值得参数名称,字符串格式
    public function __get($name){
        echo'调用了魔术方法__get&nbsp;&nbsp;';
        if(property_exists($this,$name)){
           return $this->$name;
        }else{
            echo'没有对应的属性:'.$name.'<br>';
            return null;
        }
    }
    private  function myself(){
        echo'火柴人访问的方法<br>';
    }
    private  function mytest($num){
    echo'<br>接收的数据'.$num .'<br>';
}
//__call 如果没有定义则没有
//第一个参数:调用的方法名称(字符串),第二个参数:该方法的参数(数组格式),需要自己拆分
    public function __call($name,$canshu){
//        $this->$name($canshu);
        switch(count($canshu)){
            case 0:call_user_func(array($this,$name));
                break;
            case 1:call_user_func(array($this,$name),$canshu[0]);
            break;
            case 2:call_user_func(array($this,$name),$canshu[0],$canshu[1]);
                break;
        }
    }
    public function __isset($value){
    echo'调用了__isset方法&nbsp;&nbsp;';
    return isset($value);
}


    //__toString函数是将对象手动转换为字符串格式的内容,以便操作或者输出
    //该函数要求必须有一个返回值,且格式必须是字符串
    public function __toString(){


        return "数字:".$this->num1.',年龄:'.$this->num2;
    }
    //把对象用函数的方式进行书写调用时,自动访问__invoke函数
    public function __invoke($canshu=""){


        return "接受的参数:".$canshu;
    }
}
$ms=new MoShu();
$ms->age=30;
$ms->num2=20;
$ms->num1=10;
$ms->num3=40;


var_dump($ms);
echo $ms->num2;
echo'<br><br>';
echo$ms->num3;


//系统函数isset访问类中不可直接访问的属性时,仅仅只调用了__isset魔术方法
echo'<br><br>';
$ms->myself();
$ms->mytest(100);
echo'<br><br>';
echo $ms->num2.'&nbsp;&nbsp;';
if(isset($ms->num2)){
    echo'isset:OK';
}else{
    echo'isset:NO';


}
//系统函数empty访问类中不可直接访问的属性时,仅仅只调用了__empty魔术方法,在调用__get魔术方法
echo'<br><br>';
echo $ms->num2.'&nbsp;&nbsp;';
if(empty($ms->num2)){
    echo'empty:OK';
}else{
    echo'empty:NO';
}
echo'<br><br>';echo'<br><br>';
echo $ms;


echo'<br><br>';
echo $ms(100);


echo'<br><br>';
var_dump($ms);
$clms=clone $ms;
var_dump($clms);


echo'<br><br>';


$ms->num1=100;
var_dump($ms);
var_dump($clms);


echo'<br><br>';
class Test{


}
if($clms instanceof MoShu){
    echo 'OK';
}else{
    echo'NO';
}


echo'<br><br>';


if($clms instanceof Test){
    echo 'OK';
}else{
    echo'NO';
}
?>
</body>
</html>

你可能感兴趣的:(object基础魔术方法使用代码)