购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

9.1 什么是类

面向对象编程就是要把需要解决的问题抽象为类。在现实生活中,我们可以找到很多这样的例子,比如可以抽象出这个世界上的一个物种为人类,人类具有身高、体重、腰围等属性,同时人类还可以执行一些动作,比如行走、吃饭、跳跃等。同理,在编程中,抽象出的类也具有这样的属性和动作,不过在类中,我们把这种“动作”称作类的方法。比如常用的数据库连接类,在这个类中一般会包含数据库类型、数据库的HOST、数据库用户名和密码等属性,同时也包含一些数据库操作的方法,如插入、更新、查询、删除数据等。数据库连接类的示例图如图9-1所示。

图9-1 数据库连接类

9.1.1 声明一个类

类在使用前需要声明,声明一个类使用关键词class,比如声明一个数据库连接类,例如:


     <?php
     class conn{
        private $dbtype = 'mysql';
        private $host = '127.0.0.1';
        private $username = 'root';
        private $password = '123456';
        private $pre = 'zwt_';
        public function insert(){}
        public function update(){}
        public function delete(){}
        public function select(){}
     }
     ?>

以上代码声明了一个包含数据库连接属性和操作方法的类conn,其中的private和public是定义属性和方法的关键词,其规定了被定义的属性和方法可在什么地方被访问。

$dbtype、$host、$username、$password、$pre是该类中的属性,function定义类中的方法。

9.1.2 实例化一个类

在声明一个类之后,要使用类中的方法,一般需要先实例化一个类,这个实例便是类中的对象。创建一个类的实例使用关键词new。示例如下:


     <?php
     class conn{
        private $dbtype = 'mysql';
        private $host = '127.0.0.1';
        private $username = 'root';
        private $password = '123456';
        private $pre = 'zwt_';
        public function insert(){}
        public function update(){}
        public function delete(){}
        public function select(){}
     }
     $connObj = new conn();
     var_dump($connObj);
     ?>

本例创建了类conn的一个实例。如果是在类内部创建实例,可以使用new self来创建新对象。一个类可以实例化多个对象,每个对象都是独立的个体,这些实例化的对象拥有类中定义的全部属性和方法。当对其中一个对象进行操作时,比如改变该对象的属性等,不会影响其他对象。

9.1.3 访问类中成员

实例化一个类后,要访问类中的成员,可使用符号“->”,请看下面的示例:


     <?php
     class conn{
        public $dbtype = 'mysql';
        private $pre = 'zwt_';
        public function test(){
          echo "test";
        }
     }
     $obj = new conn();
     $obj->test();
     echo $obj->dbtype;
     ?>

该例中使用“->”访问类conn中的test对象。

在对象方法执行的时候会自动定义一个$this的特殊变量,表示对象本身的引用。通过$this->形式可引用该对象的方法和属性,其作用就是完成对象内部成员之间的访问,示例如下:


     <?php
     class conn{
        public $dbtype = 'mysql';
        public function test(){
          echo $this->getDbtype();
        }
        public function getDbtype(){
          echo $this->dbtype;
        }
     
     }
     $obj = new conn();
     $obj->test();
     ?>

访问对象的成员有时还可使用“::”符号。使用该符号一般有以下3种情况:

·parent::父类成员,这种形式的访问可调用父类的成员变量常量和方法。

·self::自身成员,这种形式的访问可调用当前类中的静态成员和常量。

·类名::成员,这种形式的访问可调用类中的变量常量和方法。

“::”符号的使用示例如下:


     <?php
     class conn{
        public $dbtype = 'mysql';
        const HOST = '127.0.0.1';               // 在类中使用const定义常量HOST
        public function test(){
          echo "test";
          //echo $this->getDbtype();         //静态方法getDbtype()不能在类内部以$this->的形式访问
        }
        public function test1(){
          echo self::HOST;             // self访问常量HOST
          self::getDbtype();            // self访问静态方法getDtype()
        }
        public static function getDbtype(){     //使用static修饰的方法称为静态方法
          echo "mysql";
        }
     }
     $obj = new conn();
     $obj->test1();
     conn::test();                      // 没有实例化类,使用“::”访问类中的方法
     ?>

本示例运行结果为:


     127.0.0.1mysqltest 

9.1.4 静态属性和静态方法

在PHP中,通过static关键词修饰的成员属性和方法称为静态属性和静态方法。静态属性和静态方法可在不被实例化的情况下直接使用。

1.静态属性

在类中,有一个静态属性的概念。和常规属性不一样的是,静态属性属于类本身,而不属于任何实例。因此其也可称为类属性,以便和对象的属性区分开来。静态属性使用static关键词定义,在类外部可使用“类名::静态属性名”的方式访问,在类内部可使用“self::静态属性名”的方式访问。

示例如下:


     <?
     class myclass{
        static $staticVal = 0;
        function getStatic(){
          echo self::$staticVal;
          self::$staticVal++;
        }
     }
     echo myclass::$staticVal;  // 输出 0
     $obj = new myclass();
     $obj->getStatic();       // 输出 0 
     echo myclass::$staticVal;          // 输出 1
     ?>

执行以上程序的结果为:


     001

可见在实例化的对象中改变了静态属性$staticVal的值,再次访问类属性时其值已被改变。

2.静态方法

和静态属性相似,使用static修饰的方法称为静态方法,也可在不被实例化的情况下使用,其属于类而不是被限制到任何一个特定的对象实例。因此$this在静态方法中不可使用,但可在对象实例中通过“$this->静态方法名”的形式调用静态方法,在类内部需要使用“self::静态方法名”的形式访问。示例代码如下:


     <?
     class myclass{
        static $staticVal = 0;
        public $val = 100;
        static function getStaticVal(){
          echo self::$staticVal;
        }
        static function changeStaticVal(){
          self::$staticVal++;
          echo self::$staticVal;
          //$this->val++;
        }
        function change(){
          $this->changeStaticVal();      // 在类内部使用$this调用静态方法
        }
     }
     myclass::getStaticVal();
     myclass::changeStaticVal();
     $obj = new myclass();
     $obj->change();
     ?>

执行以上程序的输出结果为:


     012

9.1.5 构造方法和析构方法

构造方法是在创建对象时自动调用的方法,析构方法是在对象销毁时自动调用的方法。

1.构造方法

构造方法常用的场景是在创建对象时用来给变量赋值,构造方法使用“__construct”定义。使用示例如下:


     <?php
     class yourclass{
        public $name;
        public $age;
        function __construct($name,$age){
          $this->name = $name;
          $this->age = $age;
        }
        function get($key){
          return $this->$key;
        }
     }
     $test_1 = new yourclass('Tom',20);
     echo $test_1->get('name');
     $test_2 = new yourclass('Jim',30);
     echo $test_2->get('age');
     ?>

执行以上程序的输出结果为:


     Tom 30 

2.析构方法

析构方法和构造方法正好相反,析构方法是在对象被销毁前自动执行的方法。析构方法使用“__desctruct”定义。使用示例如下:


     <?php
     class yourclass{
        public $name;
        public $age;
        function __construct($name,$age){
          $this->name = $name;
          $this->age = $age;
        }
        function get($key){
          return $this->$key;
        }
        function __destruct(){
          echo "execute automatically";
        }
     }
     $test_1 = new yourclass('Tom',20);
     echo $test_1->get('name');
     echo $test_1->get('age');
     ?>

执行以上程序的输出结果为:


     Tom 20 execute automatically 

在PHP中有一种垃圾回收机制,可以自动清除不再使用的对象,释放内存。析构方法在垃圾回收程序执行之前被执行。 bsZj4HeXvffkfPKIDtqsz+CSKWsEd6SUg8O1Ctt2MOU9SVGBUe2ADFyFWVjqI6o/

点击中间区域
呼出菜单
上一章
目录
下一章
×