构造方法
构造方法又叫魔术方法,是类在实例化过程中自动触发的方法,即类的初始化。
语法如下,其中 $this表示为当前对象的引用,就理解为该类实例化后的对象。
构造函数不光只可以初始化属性,还可以初始化方法。
class Demo2 { public $name; public $age; //构造方法 //又叫魔术方法 // 系统自动触发的方法 public function __construct($name,$age) { // 作用:用来初始化对象的状态,这个状态由属性决定 $this->name = $name; $this->age = $age; // 完成对象创建时的自动化操作 // 自动执行 getName() 函数 $this->getName(); } public function getName(){ return $this->name; } } $people = new Demo2('zmx',24);
子类继承
实现子类继承使用 extends 关键字。
子类继承一般有以下三个场景使用。
先定义个父类:
class Fruit { public $name; public $price; public function __construct($name,$price) { $this->name = $name; $this->price = $price; $this->getName(); } public function getName(){ return $this->name; } public function getPrice(){ return $this->price; } }
1. 代码复用:复用父类中成员
class Apple extends Fruit { // 1. 代码复用 // ... } $apple1 = new Apple('苹果',100); echo $apple1->getName(); // 这里看到父类中成员全部被子类继承了
2. 子类中功能扩展,在子类中定义新属性方法
class Peach extends Fruit { // 2. 功能扩展 public $place; // 新增属性 public function __construct($name, $price, $place) { 在父类的构造函数基础上加入新的属性 parent::__construct($name, $price); $this->place = $place; } // 这里扩展一个 intro 方法 public function intro(){ return '果名:'.$this->name.'价格:'.$this->price.'产地:'.$this->place; } } $peach1 = new Peach('水蜜桃','19','阳山'); echo $peach1->intro();
3. 改写父类中方法
class Grape extends Fruit { public $season; public function __construct($name, $price, $season) { parent::__construct($name, $price); $this->season = $season; } // 3. 方法改写 public function getName() { $name = parent::getName(); return $name.':水果之王'; } public function getPrice() // 改写getPrice()方法,加点判断进去 { $price = parent::getPrice(); // 旺季涨价,淡季减价 if($this->season == '旺季') { $newPrice = $price * 1.2; }else if ($this->season == '淡季'){ $newPrice = $price * 0.7; } return $newPrice; } } $grape1 = new Grape('葡萄','100','旺季'); echo $grape1->getName(); echo $grape1->getPrice();
访问控制符
public 类中类外都可以访问,子类也可以访问
protected 类中可以访问,类外不能访问,子类可以访问
private 只允许在自己类中使用,类外子类都不行,这是最严格的
class People { public $name; protected $sex; private $age; public function __construct($name, $sex, $age) { $this->name = $name; $this->sex = $sex; $this->age = $age; } public function getSex() { return $this->sex; } public function getAge() { return $this->age; } } $guy = new People('Tom', 'male', 23); echo $guy->name; // public 可以直接访问 echo $guy->getSex(); // protected 类中可以访问,类外没法访问 echo $guy->getAge(); // private 类中可以访问,类外没法访问 class Son extends People { function getSex(){ return $this->sex; } function getAge() { // return $this->age; // 没法访问父类中 private 成员 } } $son = new Son('Jack','male',78); echo $son->getSex(); // 可以在子类中访问到 protected echo $son->getAge(); // 不可以在子类中访问到 pivate