当前位置:网站首页>PHP中abstract(抽象)、final(最终)和static(静态)原理与用法
PHP中abstract(抽象)、final(最终)和static(静态)原理与用法
2022-07-31 05:10:00 【?vsVSvs??】
1.abstract(抽象)
定义为抽象的类不能被实例化。任何一个类,如果它里面至少有一个方法是被声明为抽象的,那么这个类就必须被声明为抽象的。
特点:
- 类中有任何抽象方法那这个类也必须为抽象的;
- 抽象类只能申明调用方式和参数,不能定义具体功能实现;
- 继承抽象类的子类必须实现抽象类的所有抽象方法;
- 子类中实现的抽象方法的访问控制必须比父类的访问控制更严格;
- 子类中实现的方法的调用方式及参数数量必须与被实现的方法一致。
代码示例:
#抽象类
abstract class Table{
#强制子类定义这个方法
abstract public function create($table);
#普通方法 子类不要重新写 直接继承
public function select(){
echo '查询';
}
}
class member extends Table{
#必需定义该方法 但是参数可以定义一些 父类不存在的参数 作为可选参数
public function create($table,$name=''){
echo '创建:'.$table.'&name='.$name;
}
}
$member = new member();
$member->create('member','id');#创建:member&name=id
$member->select();#查询
2.final(最终)
它可以在类或类中成员方法前使用,但是不能用来修饰成员属性。如果某个类不想被继承,那么就可以使用 final 来修饰这个类。使用 final 修饰的类不能有子类,也就不能对它进行拓展。
特点:
- 使用 final
修饰的类,不能被继承;
- 类中使用 final
修饰的成员方法,在子类中不能覆盖(重写)该方法;
定义类:
代码示例:
# 定义一个不能被继承的类
final class test{
}
#去继承上面这个类
class test1 extends test{
}
报错提示:
PHP Fatal error: Class test1 may not inherit from final class (test)
定义方法:
代码示例:
# 定义一个不能被继承的类
class test{
final public function add(){
echo '我不想被继承';
}
}
#去继承上面这个类
class test1 extends test{
public function add(){
echo '我重新定义一下这个方法';
}
}
报错提示:
PHP Fatal error: Cannot override final method test::add()
3.static(静态)
用来定义累的静态属性或方法,可以在类未被实例化时使用,静态属性单独占用内存而不会因创建多个对象时而导致同样的方法或者属性重复占用。
注意:
1.静态方法内部禁止出现非静态内容!
2.在静态方法中,只能调用静态变量,不能调用普通变量;而普通方法则可以调用静态变量。
class ceshi{
static public $num =0;
public static function add(){
self::$num = self::$num +1;
echo self::$num;
}
public function addNum(){
self::$num = self::$num +1;
echo self::$num;
}
}
$ceshi = new ceshi();
$ceshi::add();//1
$ceshi->addNum();//2
总结:静态成员不用实例化对象,当类第一次被加载时就已经分配了内存空间,所以直接调用静态成员的速度要更快一些。但如果静态成员声明得过多,空间一直被占用,反而影响系统的运行速度。
边栏推荐
- Flask 的初识
- Swordsman Offer Special Assault Edition ---- Day 6
- leetcode-每日一题745. 前缀和后缀搜索(哈希和字典树)
- 关于LocalDateTime的全局返回时间带“T“的时间格式处理
- About the problems encountered by Xiaobai installing nodejs (npm WARN config global `--global`, `--local` are deprecated. Use `--location=glob)
- 有了MVC,为什么还要DDD?
- 【数据库学习】Redis 解析器&&单线程&&模型
- 关于superset集成到自己的项目中
- gin框架学习-GORM框架进阶之CRUD接口(数据库增删改查操作)
- 11 【定位】
猜你喜欢
07 【内置指令 自定义指令】
Redis Advanced - Cache Issues: Consistency, Penetration, Penetration, Avalanche, Pollution, etc.
账号或密码多次输入错误,进行账号封禁
The interviewer asked me TCP three handshake and four wave, I really
第7章 网络层第3次练习题答案(第三版)
leetcode-每日一题剑指 Offer II 041. 滑动窗口的平均值(队列模拟)
Redis管道技术/分区
08 【生命周期 组件】
Redis 事务学习有感
面试Redis 高可靠性|主从模式、哨兵模式、Cluster集群模式
随机推荐
剑指offer专项突击版 ---- 第2天
数据库上机实验7 数据库设计
数据库上机实验6 数据库完整性
Kubernetes加入集群的TOKEN值过期
[MQ I can speak for an hour]
a different object with the same identifier value was already associated with the session
uni-app进阶之创建组件/原生渲染【day9】
变量的解构赋值
数据库上机实验5 数据库安全性
leetcode-每日一题1217. 玩筹码(贪心+位运算)
C语言指针详解
闭包(四)----IIFE
Redis的初识
数据库上机实验2 单表查询和嵌套查询
剑指offer基础版 ---- 第27天
leetcode-每日一题558. 四叉树交集(分治递归)
Quickly master concurrent programming --- the basics
Swordsman Offer Special Assault Edition --- Day 3
关于小白安装nodejs遇到的问题(npm WARN config global `--global`, `--local` are deprecated. Use `--location=glob)
Flask 的初识