美文网首页
PHP面向对象

PHP面向对象

作者: 天蚕 | 来源:发表于2017-01-16 15:06 被阅读56次
    概念:

    php类定义'class'开头{}包裹类的实现
    (实例化)生成对象需要使用关键字'new',对象在销毁之后会系统自动回收内存

    类当中的属性:

    php的属性必须表明访问控制权限(public,private,protected),属性名跟变量的命名规则一样
    eg :public $name = '汽车';引用对象属性对象->属性名称(不需要$)

    类当中的方法:

    php类中的方法分为对象方法和静态方法,而且php的类存在构造方法(创建对象时必然执行该方法)__construct和析构方法(对象销毁必然执行该方法)__destruct ;默认的方法是对象方法,如果要声明为静态方法只需要在function关键字前添加关键字static;构造方法和析构方法属于静态方法,通常不需要手动执行;调用对象方法使用指向符->,调用静态方法使用类名加::来调用eg :Response::json();方法同样可以表明访问控制权限

    特殊关键字:

    parentself$this这三个关键字都用于类的实现内部。parentself都代表类parent代表父类,self代表类本身;$this代表实例化的对象;

    继承

    php继承关键字extends

    class Response{
       //属性
       public $name = '汽车';
       private $name1 = '汽车';
       protected $name2 = '汽车';
    
        public static function json($code,$message = "",$data)
        {
            if(!is_numeric($code)) 
           { 
               return null;
            }
            $result = array(
                "code" => $code, 
               "message" => $message, 
               "body" => $data
            );
            echo json_encode($result);
        }
    
        //构造方法
       function __construct()
      {
          parent::__construct();
      }
    
        //析构方法
        function __destruct()
        {
        }
        //静态方法
        static function testStatic1()
        {
            return "静态方法测试";
        }
        static function testStatic2()
        {
             return self::testStatic1();
        }
        //对象方法
        function testInstance1()
       {
          return "实例方法测试";
       }
    
       function testInstance2()
      {
         $this->testInstance1();
      }
    }
    
    //继承
    class Car
    {
    }
    
    class Truck extends Car
    {
    
    }
    
    PHP对象重载

    PHP中的重载与其他语言的重载不同,PHP中的重载指的是动态的创建属性与方法,是通过魔术方法来实现的。
    重载属性
    属性的重载通过__set__get__isset__unset来分别实现对不存在属性的赋值、读取、判断属性是否设置、销毁属性。
    方法重载
    使用__call实现方法的重载。

    //name属性动态创建并赋值
    class Car {
        private $ary = array();
        
        public function __set($key, $val) {
            $this->ary[$key] = $val;
        }
        
        public function __get($key) {
            if (isset($this->ary[$key])) {
                return $this->ary[$key];
            }
            return null;
        }
        
        public function __isset($key) {
            if (isset($this->ary[$key])) {
                return true;
            }
            return false;
        }
        
        public function __unset($key) {
            unset($this->ary[$key]);
        }
    }
    $car = new Car();
    $car->name = '汽车';  //name属性动态创建并赋值
    echo $car->name;
    
    //动态添加方法
    class Car {
        public $speed = 10;
    
        public function __call($name, $args) {
        if ($name == 'speedDown') {
            $this->speed -= 10;
        }
    }
        
    }
    $car = new Car();
    $car->speedDown(); //调用不存在的speedDown方法
    echo $car->speed;
    
    PHP对象高级特性

    对象比较:当同一个类的两个实例的所有属性都相等时,可以使用比较运算符==进行判断,当需要判断两个变量是否为同一个对象的引用时,可以使用全等运算符===进行判断。
    对象复制:可以通过关键字clone来复制一个对象,这时__clone方法会被调用(需要自己实现),通过这个魔术方法来设置属性的值。
    对象序列化:可以通过serialize方法将对象序列化为字符串,用于存储或者传递数据,然后在需要的时候通过unserialize将字符串反序列化成对象进行使用。

    //对象比较
    class Car {
    }
    $a = new Car();
    $b = new Car();
    if ($a == $b) echo '==';   //true
    if ($a === $b) echo '==='; //false
    
    //对象复制
    class Car {
        public $name = 'car';
        
        public function __clone() {
            $obj = new Car();
            $obj->name = $this->name;
        }
    }
    $a = new Car();
    $a->name = 'new car';
    $b = clone $a;
    var_dump($b);
    
    //对象序列化
    class Car {
        public $name = 'car';
    }
    $a = new Car();
    $str = serialize($a); //对象序列化成字符串
    echo $str.'<br>';
    $b = unserialize($str); //反序列化为对象
    var_dump($b);
    

    相关文章

      网友评论

          本文标题:PHP面向对象

          本文链接:https://www.haomeiwen.com/subject/daykbttx.html