父类和子类Student.php
<?php class Students{ protected $name; protected $cls; protected $age; //定义构造方法 public function __construct($name,$cls,$age) { $this->name = $name; $this->cls = $cls; $this->age = $age; } public function study() { return '学习'; } } class Student extends Students{ //创建查询器,实现了外部访问 public function __get($pro) { return $this->$pro; } //对父类属性进行扩展,增加新的特征 private $sex; //性别 private $hobby; //爱好 //必须使用构造方法对使用当前新增属性生效 public function __construct($name,$cls,$age,$sex,$hobby) { //调用父类构造器初始化类属性 parent::__construct($name, $cls, $age); $this->sex = $sex; $this->hobby = $hobby; } //增加新的方法,扩展父类的功能 public function sport() { return '游泳'; } //将父类方法进行重写,就是功能重载,必须使用与父类一样的方法名:call() public function study() { return parent::study().'完后去'.$this->sport(); } }
运行实例 »
点击 "运行实例" 按钮查看在线实例
index.php
<?php //类的继承和重载 //自动加载类文件 spl_autoload_register(function($className){ require './class/'.$className.'.php'; }); $student = new Student('张三丰','三年级',12,'男','打篮球'); //下面我们换一组数据来初始化对象,验证parent::__contrunctor() $student = new Student('张无忌','一年级', 10,'女','游泳'); echo '姓名: '.$student->name.'<br>'; echo '年级: '.$student->cls.'<br>'; echo '年龄: '.$student->age. '<br>'; //下面输出二个在子类中扩展的属性 echo '性别:'.$student->sex.'<br>'; echo '爱好:'.$student->hobby.'<br>'; echo $student->study().'<br>'; //study()是父类中的方法 echo $student->sport().'<br>'; //sport()是子类中的方法
运行实例 »
点击 "运行实例" 按钮查看在线实例
总结:
继承
extends 关键字来继承类
被继承的类,我们称之为父类
继承后的类,我们称之为子类
子类继承父类非私有的属性和方法
public 在本类,子类,以及类的外部都访问
protected 保护型的属性,自己以及子类能访问
private 私有的不能被继承,只能自己访问
子类可以访问父类的非私有的属性和方法, 使用$this关键字访问
覆盖:子类中声明与父类相同名称的属性和方法,
属性被覆盖后,就无法访问父类的属性
方法被覆盖后,依旧可以访问父类的方法 parent::方法名()
final修饰类和方法
被final修饰的类是不能被继承
被final修饰的方法不能被子类覆盖
static修饰属性和方法
属性
static修改的属性是可以修改的,是所有实例共享,也就是属于类,非静态的是每个对象都会保存一份不一样的
访问:本类中使用 self::$属性名 父类中使用 parent::$属性名
方法
static修饰的方法,它里面只能使用静态属性和静态方法,不能使用普通的属性和普通的方法
访问:类名::静态方法() self::静态方法()
静态方法和属性的用途,单例设计模式:
设计模式其实就是前人总结的一些规律
作为对象的创建模式,单例设计模式确保某一个类只有一个实例,而且自行实例化并向整个系统全局提供这个单例,它不会创建实例副本,而是会向单例类内部存储的实例返回一个引用
接口
声明
interface 接口名{
//方法是不能有实现
function 方法名();
}
实现接口
class 类名 implements 接口1,接口2{
//必须要实现接口中定义的方法,否则会报错
}
抽象类
声明
abstract class 类名{
//抽象类当中也可以包含有实现的方法
function 方法名(){
//
}
//抽象方法不能有实现,一个抽象类中必须要有一个抽象方法
abstract function 方法名();
}
使用
class 类 extends 抽象类{
//实现我们的抽象方法
function 方法名(){
}
}
魔术方法
__toString 当将对象直接输出时,会调用此魔术方法,此方法返回一个字符串
__call 当调用的方法不存在时
__callStatic 当调用的静态方法不存在时
__get 当访问不存在的属性
__set 当给不存在的属性赋值时