面向对象编程中最核心的概念就是类(Class)和对象(Object),类是对象的抽象模板,而对象是类的具体实例
对象包含的数据称之为类属性(Property),操作数据的函数称之为类方法(Method)
**
PHP 内置的 class_exists
方法判断该类是否存在
构造函数 __construct
PHP 通过 public
(公开)、protected
(保护)、private
(私有)关键字控制类属性和方法的可见性
继承
继承可以继承父类的protected
或者 public
方式定义的属性和方法
通过parent::
来调用父类的方法
PHP 遵循单继承机制,即一个子类只能继承自一个父类。
封装
封装一方面指的是调用者无需关心对象方法实现细节,另一方面是通过访问控制限定属性和方法的可见性
反射
可以通过反射的方式将 protected
或者 private
级别的属性和方法变成类以外可以访问
class Benz extends Car
{
private $customProp = '自定义属性';
...
private function customMethod()
{
echo "Call custom prop \$customProp: " . $this->customProp . PHP_EOL;
echo "This is a custom method in Benz Class" . PHP_EOL;
}
}
// 通过反射调用非 public 方法
$method = new ReflectionMethod(Benz::class, 'customMethod');
$method->setAccessible(true);
$benz = new Benz();
$method->invoke($benz);
多态
方法重写
所谓多态,指的是在 PHP 继承体系中,子类可以重写父类的同名方法,这样,在子类对象中调用该方法,就会自动转发到子类方法调用
子类重写父类方法
**
类型转化
PHP 不像 Java 那样支持同一个类中定义多个同名方法(参数数量或类型不同,这种叫做方法重载),另外,由于子类一定包含了父类的公开方法,所以当类作为参数类型声明时,如果声明类型为父类,则可以传入子类对象,反过来,如果声明类型为子类,则不能传入父类对象
子类可以替代父类传入
**
抽象类
抽象类本身不能被实例化,只能被子类继承,继承了抽象类的子类必须实现父类中的抽象方法
<?php
abstract class Car
{
abstract public function drive();
}
接口
实现了某个接口的类必须实现接口声明的所有方法
接口中不包含任何具体的属性和方法,完全是待实现的「契约」,实现接口的类就相当于和它签了契约,必须要通过实现接口中声明的所有方法来履行契约
interface Car
{
public function drive();
}
在 PHP 中,还提供了一个类型运算符 instanceof
,用于判断某个对象实例是否实现了某个接口,或者是某个父类/抽象类的子类实例