zoukankan      html  css  js  c++  java
  • PHP学习六--类和对象

    1.类是面向对象程序设计的基本概念,通俗的理解类就是对现实中某一个种类的东西的抽象, 比如汽车可以抽象为一个类,汽车拥有名字、轮胎、速度、重量等属性,可以有换挡、前进、后退等操作方法。

    通常定义一个汽车类的方法为:

    class Car {
        $name = '汽车';
        function getName() {
            return $this->name;
        }
    }

    类是一类东西的结构描述,而对象则是一类东西的一个具体实例,例如汽车这个名词可以理解为汽车的总类,但这辆汽车则是一个具体的汽车对象。

    对象通过new关键字进行实例化:

    $car = new Car();
    echo $car->getName();
    //实例化一个car对象
    $car = new Car();
    $car->name = '奥迪A6'; //设置对象的属性值
    echo $car->getName();  //调用对象的方法 输出对象的名字

    在类中定义的变量称之为属性,通常属性跟数据库中的字段有一定的关联,因此也可以称作“字段”。属性声明是由关键字 public,protected 或者 private 开头,后面跟一个普通的变量声明来组成。属性的变量可以设置初始化的默认值,默认值必须是常量。

    访问控制的关键字代表的意义为:

    public:公开的 protected:受保护的 private:私有的

    class Car {
        //定义公共属性
        public $name = '汽车';
    
        //定义受保护的属性
        protected $corlor = '白色';
    
        //定义私有属性
        private $price = '100000';
    }

    默认都为public,外部可以访问。一般通过->对象操作符来访问对象的属性或者方法,对于静态属性则使用::双冒号进行访问。当在类成员方法内部调用的时候,可以使用$this伪变量调用当前对象的属性。受保护的属性与私有属性不允许外部调用,在类的成员方法内部是可以调用的。

    $car = new Car();
    echo $car->name;   //调用对象的属性
    echo $car->color;  //错误 受保护的属性不允许外部调用
    echo $car->price;  //错误 私有属性不允许外部调用

    受保护的属性与私有属性不允许外部调用,在类的成员方法内部是可以调用的。

    class Car{ private $price = '1000'; public function getPrice() { return $this->price; //内部访问私有属性 ​ } }

    PHP定义类的方法

    方法就是在类中的function,很多时候我们分不清方法与函数有什么差别,在面向过程的程序设计中function叫做函数,在面向对象中function则被称之为方法。

    同属性一样,类的方法也具有public,protected 以及 private 的访问控制。

    访问控制的关键字代表的意义为: public:公开的 protected:受保护的 private:私有的

    我们可以这样定义方法:

    class Car {
        public function getName() {
            return '汽车';
        }
    ​}
    $car = new Car();
    echo $car->getName();
    

    使用关键字static修饰的,称之为静态方法,静态方法不需要实例化对象,可以通过类名直接调用,操作符为双冒号::。

    class Car {
        public static function getName() {
            return '汽车';
        }
    ​}
    echo Car::getName(); //结果为“汽车”

    构造函数和析构函数

    PHP5可以在类中使用__construct()定义一个构造函数,具有构造函数的类,会在每次对象创建的时候调用该函数,因此常用来在对象创建的时候进行一些初始化工作。

    class Car {
       function __construct() {
           print "构造函数被调用
    ";
       }
    }
    $car = new Car(); //实例化的时候 会自动调用构造函数__construct,这里会输出一个字符串

    在子类中如果定义了__construct则不会调用父类的__construct,如果需要同时调用父类的构造函数,需要使用parent::__construct()显式的调用。

    class Car {
       function __construct() {
           print "父类构造函数被调用
    ";
       }
    }
    class Truck extends Car {
       function __construct() {
           print "子类构造函数被调用
    ";
           parent::__construct();
       }
    }
    $car = new Truck();

    同样,PHP5支持析构函数,使用__destruct()进行定义,析构函数指的是当某个对象的所有引用被删除,或者对象被显式的销毁时会执行的函数。

    class Car {
       function __construct() {
           print "构造函数被调用 
    ";
       }
       function __destruct() {
           print "析构函数被调用 
    ";
       }
    }
    $car = new Car(); //实例化时会调用构造函数
    echo '使用后,准备销毁car对象 
    ';
    unset($car); //销毁时会调用析构函数

    当PHP代码执行完毕以后,会自动回收与销毁对象,因此一般情况下不需要显式的去销毁对象。

    PHP的Static静态关键字

    静态属性与方法可以在不实例化类的情况下调用,直接使用类名::方法名的方式进行调用。静态属性不允许对象使用->操作符调用。

    class Car {
        private static $speed = 10;
        
        public static function getSpeed() {
            return self::$speed;
        }
    }
    echo Car::getSpeed();  //调用静态方法

    静态方法也可以通过变量来进行动态调用

    $func = 'getSpeed';
    $className = 'Car';
    echo $className::$func();  //动态调用静态方法

    静态方法中,$this伪变量不允许使用。可以使用self,parent,static在内部调用静态方法与属性。

    class Car {
        private static $speed = 10;
        
        public static function getSpeed() {
            return self::$speed;
        }
        
        public static function speedUp() {
            return self::$speed+=10;
        }
    }
    class BigCar extends Car {
        public static function start() {
            parent::speedUp();
        }
    }
    
    BigCar::start();
    echo BigCar::getSpeed();

    PHP访问控制

    前面的小节,我们已经接触过访问控制了,访问控制通过关键字public,protected和private来实现。被定义为公有的类成员可以在任何地方被访问。被定义为受保护的类成员则可以被其自身以及其子类和父类访问。被定义为私有的类成员则只能被其定义所在的类访问。

    类属性必须定义为公有受保护私有之一。为兼容PHP5以前的版本,如果采用 var 定义,则被视为公有。

    class Car {
        $speed = 10; //错误 属性必须定义访问控制
        public $name;   //定义共有属性
    }

    类中的方法可以被定义为公有私有受保护。如果没有设置这些关键字,则该方法默认为公有

    PHP对象比较:

    当同一个类的两个实例的所有属性都相等时,可以使用比较运算符==进行判断,当需要判断两个变量是否为同一个对象的引用时,可以使用全等运算符===进行判断。

    class Car {
    }
    $a = new Car();
    $b = new Car();
    if ($a == $b) echo '==';   //true
    if ($a === $b) echo '==='; //false

    PHP对象的复制
    在一些特殊情况下,可以通过关键字clone来复制一个对象,这时__clone方法会被调用,通过这个魔术方法来设置属性的值。
    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);

    对象的序列化

    可以通过serialize方法将对象序列化为字符串,用于存储或者传递数据,然后在需要的时候通过unserialize将字符串反序列化成对象进行使用。

    class Car {
        public $name = 'car';
    }
    $a = new Car();
    $str = serialize($a); //对象序列化成字符串
    echo $str.'<br>';
    $b = unserialize($str); //反序列化为对象
    var_dump($b);
  • 相关阅读:
    CodeForces 510C Fox And Names (拓扑排序)
    Codeforces 1153D Serval and Rooted Tree (简单树形DP)
    HDU 6437 Problem L.Videos (最大费用)【费用流】
    Luogu P3381 (模板题) 最小费用最大流
    Codeforces 741B Arpa's weak amphitheater and Mehrdad's valuable Hoses (并查集+分组背包)
    Codeforces 1144F Graph Without Long Directed Paths (DFS染色+构造)
    HDU 2204 Eddy's 爱好 (容斥原理)
    Codeforces 939E Maximize! (三分 || 尺取)
    Codeforces 938D. Buy a Ticket (最短路+建图)
    CodeForces 959E Mahmoud and Ehab and the xor-MST (MST+找规律)
  • 原文地址:https://www.cnblogs.com/moxuexiaotong/p/6610405.html
Copyright © 2011-2022 走看看