面向对象编程中最核心的概念就是类(Class)和对象(Object),对象抽象模板,而对象是类的具体实例
对象包含的数据称之为类属性(Property),操作数据的函数称之为类方法(Method)
**
PHP 内置的 class_exists 方法判断该类是否存在

构造函数 __construct

PHP 通过 public(公开)、protected(保护)、private(私有)关键字控制类属性和方法的可见性

继承

继承可以继承父类的protected 或者 public 方式定义的属性和方法
通过parent::来调用父类的方法
PHP 遵循单继承机制,即一个子类只能继承自一个父类。

封装

封装一方面指的是调用者无需关心对象方法实现细节,另一方面是通过访问控制限定属性和方法的可见性

反射

可以通过反射的方式将 protected 或者 private 级别的属性和方法变成类以外可以访问

  1. class Benz extends Car
  2. {
  3. private $customProp = '自定义属性';
  4. ...
  5. private function customMethod()
  6. {
  7. echo "Call custom prop \$customProp: " . $this->customProp . PHP_EOL;
  8. echo "This is a custom method in Benz Class" . PHP_EOL;
  9. }
  10. }
  11. // 通过反射调用非 public 方法
  12. $method = new ReflectionMethod(Benz::class, 'customMethod');
  13. $method->setAccessible(true);
  14. $benz = new Benz();
  15. $method->invoke($benz);

多态

方法重写

所谓多态,指的是在 PHP 继承体系中,子类可以重写父类的同名方法,这样,在子类对象中调用该方法,就会自动转发到子类方法调用
子类重写父类方法
**

类型转化

PHP 不像 Java 那样支持同一个类中定义多个同名方法(参数数量或类型不同,这种叫做方法重载),另外,由于子类一定包含了父类的公开方法,所以当类作为参数类型声明时,如果声明类型为父类,则可以传入子类对象,反过来,如果声明类型为子类,则不能传入父类对象
子类可以替代父类传入
**

抽象类

抽象类本身不能被实例化,只能被子类继承,继承了抽象类的子类必须实现父类中的抽象方法

  1. <?php
  2. abstract class Car
  3. {
  4. abstract public function drive();
  5. }

接口

实现了某个接口的类必须实现接口声明的所有方法
接口中不包含任何具体的属性和方法,完全是待实现的「契约」,实现接口的类就相当于和它签了契约,必须要通过实现接口中声明的所有方法来履行契约

  1. interface Car
  2. {
  3. public function drive();
  4. }

在 PHP 中,还提供了一个类型运算符 instanceof,用于判断某个对象实例是否实现了某个接口,或者是某个父类/抽象类的子类实例