抽象类与接口、后期静态绑定与魔术方法简单总结
程序员文章站
2022-03-13 12:33:53
...
抽象类与接口、后期静态绑定与魔术方法简单总结
抽象类
抽象类:设计类与实现类是分离的,抽象类可以给子类提供一些公用的方法,作为子类的重写模板来使用
- 抽象类也是多态的一种,抽象类只对方法跟类做一个大概的描述,但是没有具体的实现
- 抽象类跟方法使用 abstract 关键字声明,抽象方法可以是静态方法
- 抽象类不可被实例化,无法生成对象
- 使用抽象类,需要继承抽象类后把里面的抽象方法全部重写,如果没有全部重写,那么该继承的子类也还是抽象类
- 抽象类中可以存在普通属性跟普通方法
- 抽象类中可以使用构造函数
abstract class Father{
public $name;
abstract public function eat();
public function say(){
return "my name is {$this->name}";
}
public function __construct($n)
{
$this->name=$n;
}
}
class Son extends Father{
//重写eat方法
public function eat(){
return "I'm eating";
}
}
$obj = new Son("admin");
echo $obj->say();
echo '<hr>';
echo $obj->eat();
echo '<hr>';
echo $obj->name;
接口
在类里面,不管是普通类还是抽象类都是单继承,即一个子类只能继承一个父类,但是实际开发中,我们会需要一个子类继承多个父类,这种情况下就可以使用接口来实现,接口也是多态的一种。
- 接口使用 interface 关键字替换掉 class 关键字来创建
- 接口中,只允许声明两个成员:1.类常量,2 抽象方法
类常量
- 类常量使用 const 关键字声明
- 关键字后面直接跟常量名称不需要加$符
- 一般默认所有字母大写
- 类常量的值不允许更改
- 类常量会默认为静态成员
>
- 接口中的抽象方法也可以是静态方法
- 重写接口中的静态方法时,也必须按照静态重写
- 接口中的抽象方法不带 abstract 关键字
- 子类使用接口使用 implements 关键字
- 一个子类同时使用多个接口,多个接口之间用英文逗号,隔开
interface Father{
const NAME = 'admin';
public static function eat($name);
}
class Son implements Father{
public static function eat($name){
return "I'm eating".$name.self::NAME;
}
}
// $obj = new Son();
echo Son::eat('php&');
echo '<hr>';
后期静态绑定
在普通类与普通方法中,可以使用$this将属性或方法与当前实例化的类绑定,但是静态方法的self只能与当前所在的类绑定,如果想要实现与普通方法中$this 相同的效果,就需要用到后期静态绑定也叫延迟静态绑定,使用 static 关键字调用
class Father{
public function demo(){
return "Father 下的demo方法";
}
public function test(){
return $this->demo();
}
}
class Child extends Father{
public function demo(){
return "Child 下的demo方法";
}
}
$father = new Father();
$child = new Child();
echo $father->test();
echo '<hr>';
echo $child->test();
echo '<hr>';
echo '后期静态绑定';
echo '<hr>';
class Father1{
public static function demo(){
return "Father 下的demo方法";
}
public function test(){
return static::demo();
}
}
class Child1 extends Father1{
public static function demo(){
return "Child 下的demo方法";
}
}
$father1 = new Father1();
$child1 = new Child1();
echo $father1->test();
echo '<hr>';
echo $child1->test();
常用魔术方法
- __construct()构造方法:在实例化一个类的时候自动调用
- __destruct()析构方法:在类执行完或者销毁时自动调用
- __call(函数名,函数参数):在对象中调用一个不可访问的方法时自动调用
- __callStatic(函数名,函数参数):调用一个类里面不可访问的静态方法时自动调用
- __get():在调用一个类里面不可访问的属性时自动调用
class Father{
public $name = 'admin';
protected $age = 18;
public function __get($param){
if(!empty($this->$param)){
return '您访问的属性是:'.$param.'值是:'.$this->$param;
}else{
return "参数不存在";
}
}
public function __set($param,$values){
if(!empty($this->$param)){
echo '您要修改的属性是:'.$param.'值改为了:'.$values;
return $this->$param = $values;
}else{
echo "参数不存在";
}
}
}
$obj = new Father();
echo $obj->age;
echo '<hr>';
$obj->age = 28;
上一篇: 命名空间进阶、文件上传与分页处理
下一篇: 使用 MongoDB 存储日志数据