zoukankan      html  css  js  c++  java
  • PHP面向对象的魔术方法

    <?php
    /**
    * Created by PhpStorm.
    * User: fu
    * Date: 2017/7/19
    * Time: 9:41
    */

    class Person{

    protected $name;
    private $age;

    private $mobile;

    function __construct($name, $age)
    {
    $this->name = $name;
    $this->age = $age;

    }

    /**
    * 测试使用的不能直接访问的函数
    * @param $info
    */
    protected function test1($info){
    echo '我的信息:'.$info;
    }
    private function test2(){
    echo '我不能被直接访问哦~!~!~';
    }

    // /**
    // * @return mixed
    // */
    // public function getName()
    // {
    // return $this->name;
    // }

    /**
    * __get魔术方法,当在类的外部调用不能直接访问的属性时,该函数方法被自动调用
    * 下面的格式是该魔术方法的标准形式,不能改变
    * 魔术方法必须是公共的(public),且不能定义为静态的(static),除了__callStatic
    * __get必须有返回值,所以最后结束的肯定是return语句
    * @param $name 被访问的属性的名称,它必须是一个字符串
    */
    public function __get($name){
    // echo '在类中查找对应名称的属性:'.$name;
    if(isset($this->$name)){
    return $this->$name;
    }else{
    return null;
    }
    }

    /**
    * 魔术方法__set,当设置类中的不能直接访问的属性时,自动调用该函数方法
    * 下面的格式是该魔术方法的标准形式,不能改变
    * __set不需要返回值
    * @param $name 需要设置值的类的属性名称
    * @param $value 需要设置的值
    */
    public function __set($name, $value){
    /*
    * property_exists 它用于判断类当中是否包含某个指定名称的属性
    */
    if (property_exists($this, $name)){
    $this->$name=$value;
    }
    }

    /**
    * 魔术方法,判断类中的属性是否被设置了
    * 当对不可访问属性调用 isset() 或 empty() 时,__isset() 会被调用。
    * @param $name 传入的是类的属性名称
    * @return bool 如果属性存在,则返回true;如果不存在,返回false
    */
    function __isset($name){
    if (property_exists($this, $name)){
    return isset($this->$name);
    }else{
    return false;
    }
    }

    function __unset($name){
    if (property_exists($this, $name)){
    $this->$name = null;
    }else{
    return null;
    }
    }

    /**
    * 在对象中调用一个不能直接访问的非静态方法时,__call() 会被自动调用。
    * @param $name 被访问的函数方法的名称,字符串格式
    * @param $arguments 传递过来的函数方法的参数,数组格式
    */
    function __call($name, $arguments){
    // echo '需要被访问的函数名称:'.$name;
    // var_dump($arguments);
    if(method_exists($this, $name)){
    call_user_func_array(array($this, $name), $arguments);
    }else{
    echo '没有对应的函数可以被调用';
    }

    }


    /**
    * 魔术方法,当以字符串格式输出类的对象时,默认被自动调用
    * 该函数方法结束必须有一个return语句,且返回的值必须是字符串
    */
    function __toString(){
    return '姓名:'.$this->name.',年龄:'.$this->age;
    // return 100;
    }

    /**
    * 当类的对象被克隆时自动调用执行
    * 在这里可以修改被克隆的数据值
    */
    function __clone(){
    echo '<br>数据对象被复制了一个备份<br>';
    $this->age = 35;
    }

    }

    $p = new Person('李四', 30);
    //$p->test1('成都');
    //echo '<br><br>';
    //$p->test2();
    //echo '<br><br>';
    //$p->test3();

    //echo '<br><br>';
    //echo $p;
    //print $p;
    echo '<br><br>';
    print_r($p);
    echo '<br><br>';
    $p2 = clone $p;
    $p2->name = '王五';
    print_r($p2);


    //echo '<br><br>';
    //var_dump($p);

    //echo $p->name;
    //echo $p->age;
    //echo $p->mobile;
    //var_dump($p);
    //
    //
    //$p->name = '成都';
    //$p->mobile = '13066666666';
    //$p->birth = '2000-01-01';
    //
    //unset($p->age);
    //echo '<br><br>修改后的对象值:';
    //var_dump($p);
    //
    //
    //if(isset($p->name)){
    // echo 'OK';
    //}else{
    // echo 'No';
    //}

  • 相关阅读:
    一行代码跨平台适配颠覆传统手机建站模式
    struts2接收参数的几种形式<转>
    MyEclipse生成多对多映射文件和POJO <转>
    Hibernate延迟加载机制
    Hibernate常见面试知识点<转>
    Hibernate一级缓存详解
    App Icon and Launch Images for iOS7.0 or Later
    iOS7 UITextView 光标问题
    iOS中让颜色赋值简单一点吧
    iOS状态栏变文字颜色改变
  • 原文地址:https://www.cnblogs.com/ZJCD/p/7217444.html
Copyright © 2011-2022 走看看