austindev 2020-04-25
在讲解这三大特性前,我们先讲访问修饰符。
php中有3中访问修饰符:public protected private;
public:表示公有的;可在本类、子类、对象实例中访问。
protected:表示受保护的;可在本类、子类中访问;不能在对象实例中访问。
private:表示私有的;可在本类中访问;不能在子类、对象实例中访问。
一、封装性
封装就是把抽取出来的数据和对数据的操作封装在一起,数据被保护在内部,程序的其他部分只有被授权的操作(方法)才能对数据进行操作。
class Student{ public $name; protected $age; private $play; public function __construct($name, $age){ echo ‘我是Student类‘; $this->name = $name; $this->age = $age; } } $student = new Student(‘moon‘, 18);
二、继承性
当多个类有很多共同属性和方法时,代码冗余;这时,我们可以将共有部分提取出来,封装成一个类;子类经过一些操作可以使用这个共有的父类,这个就叫继承。
语法结构:
class 父类名{}
class 子类名 extends 父类名{}
继承要素:
class Student{ public $name; protected $age; private $play; public function __construct($name, $age){ echo ‘我是Student类‘; $this->name = $name; $this->age = $age; } } // Pupil类继承Student类 class Pupil extends Student { public function testing(){ echo ‘我是Pupil‘; } public function __construct($name, $age){ parent::__construct($name, $age); // 调用父类的构造方法1 // Student::__construct($name, $age); // 调用父类的构造方法2 echo $this->name; echo $this->age; // echo $this->play; // 报错,父类private定义的属性不能被子类继承 } } new Pupil(‘sky‘, 18); // 实现类的多层继承 class A{ public $name=‘AAA‘; } class B extends A{ public $age=30; } class C extends B{} $p = new C(); echo $p->name; // 这里会输出AAA
三、多态性
class Student{ public $name; protected $age; private $play; public function getPlay(){ echo ‘我是Student‘; } } // Pupil类继承Student类 class Pupil extends Student { public function __construct(){ parent::getPlay(); // 可以这样调用父类的方法 } public function getPlay(){ echo ‘我是Pupil‘; } } $p1 = new Pupil(); // 我是Student $p1->getPlay(); // 我是Pupil
扩展:
方法重载(overload)
基本概念:函数名相同,但参数的个数或参数的类型不同,达到调用同一个函数,可以区分不同的函数
在PHP5中虽然也支持重载,但是和其它语言还是有很大区别的,php中不能定义多个同名函数
PHP5中提供了强大的“魔术”函数,使用这些魔术函数,我们可以做到函数重载
这里我们要到到 __call,当一个对象调一个方法时,而该方法不存在,则程序会自动调用__call