摘要訊息 : 學習 PHP 中的類別.

0. 前言

本文于 2022 年 3 月 18 日进行一次更新和修正. 修正之后本文已经归档, 不再享受更新.

1. 类的声明

<?php
    class 类名 {
        attribution of class
    }
?>

2. 修饰符

  • private : 类成员属性和方法即使在被继承的时候, 也不可以访问, 属于该类私有;
  • protected : 类的成员属性和方法在继承的时候, 可以被访问. 但是无法在外部 (实例化) 进行访问;
  • public : 类的成员属性和方法在外部和继承的时候, 都可以直接被访问.

3. 成员属性

<?php
    class example {
        public : $attribution;
    }
?>

4. 成员方法

<?php
    class example {
        protected function func() {
            // 方法
        }
    }
?>

5. 类的实例化

实例化就是将一个变量声明为对象 (类), 方便后续进行操作 :

<?php
    class example {
        public $name;
        public function func() {
            //方法
        }
    }
    $object = new example();    // 类的实例化
    $object->name = "hello";    // 访问类成员属性
    $object->func();    // 访问类的方法
?>

6. $this

$this 主要用于对象内部成员之间的访问, 在访问内部成员的时候, 不需要在变量前面加 "$" :

<?php
    class example {
        protected $name;
        function set_name($name) {
            $this->name = $name;
        }
    }
?>

7. static 关键字

static 通常用于在类被实例化之后, 就不再改变的变量中. 静态成员不可以用 "->" 和 "$this" 的方式直接访问, 但是可以通过 self 或者 "::" 操作符访问 :

<?php
    class example {
        public static $number = 1;
        public function get_number() {
            return self::$number;
        }
    }
    echo example::$number;    // 结果 : 1
?>

除了 static 关键字声明的变量, 类中的常量也是需要通过 self 和 "::" 访问.

8. 构造方法和析构方法

构造方法也就是构造函数, 通常用于类的实例化中给一些变量赋与初始值, 一般的格式都为 :

<?php
    public function __construct(參數列表) {
        statement
    }
?>

在实例化的过程中, 这个方法会直接被调用, 不需要额外写出函数名称.

析构方法也就是析构函数, 他会在一些对象被销毁的时候, 执行清理任务 :

<?php
    public function __destruct() {
        statement
    }
?>

通常, 在 PHP 程序结束的时候, PHP 会自动销毁所有的变量, 这个时候析构方法就会被自动调用.

这个在 Swift 关于类的课程中的实例已经非常详细, 这里不再给出实例. 虽然属于不同的语言, 关键字也有所不同, 但是在输出上, 大体是相同的.

9. 类的继承

PHP 中使用 extends 关键字来实现类的继承 :

<php
    class A extents B {
        attribution
    }
?>

在继承的过程中, protectedpublic 的成员会被继承. 如果要访问父类的静态属性和方法, 可以通过 "parent::静态属性" 进行访问. 另外, 如果你不想父类的某个方法在继承的过程中被重写, 可以添加 final 关键字 :

<?php
    public final function sum($a, $b) {
        return $a + $b;
    }
?>

如果子类尝试去重写带有 final 关键字的父类的中的方法, 就会直接报错.

10. 抽象类

抽象类就像是对类的一个规定, 规定你写的类里面要有哪些方法. 因此, 抽象类不能被实例化. 通过在类名前面添加 abstract 关键字可以声明一个抽象类, 同样也可以通过在方法前面添加 abstract 关键字来声明抽象方法. 不过, 抽象方法后面必须有分号, 这有点类似于 C++ 中的函数声明. 抽象类在继承的过程中, 只能作为父类.

<?php
    abstract class example {
        abstract public function func();
    }
?>

在继承的过程中, 必须出现一个名叫 func 的方法.