面向对象php学习笔记19:PHP继承[静态延迟绑定,final类和方法,抽象类和抽象方法,接口,trait,php重载overload,对象遍历]

Kimi K2.5 Code:代码语义解析引擎与静态依赖分析实践 代码依赖分析是软件维护、重构与排障的核心基础能力,其本质是通过静态分析理解程序结构与运行时行为之间的映射关系。传统方案依赖AST遍历或字节码追踪,受限于语言规范性、运行时环境及可追溯性;而以Kimi K2.5 Code为代表的新型工具,融合Rust轻量解析、领域知识图谱推断与大模型语义校验三层架构,在不依赖执行环境、容忍低质量代码的前提下,实现高精度、可验证的跨文件调用关系识别。该技术显著提升遗留系统治理、无文档代码理解及合规影响评估等工程场景效率,正推动从‘写代码’向‘可解释、可推演、可管控’的代码认知范 阅读详情

PHP继承

静态延迟绑定

定义:静态延迟绑定,即在类内部用来代表类本身的关键字部分不是在类编译时固定好,而是当方法被访问时动态的选择来访者所属的类.静态延迟绑定就是利用static关键字代替静态绑定self,静态延迟绑定需要使用到静态成员的重写.

1. 静态延迟绑定:使用static关键字代替self进行静态类成员访问

2. 静态延迟绑定一定是通过继承后的子类来进行访问才有效果

静态延迟绑定总结

最终类FINAL

定义:最终类,使用final关键字修饰类名,表示此类不可被继承

1. 基本语法: final class 类名

 

2. 最终类无法被继承

3. final关键字不止可以修饰类表示不可被继承,还能修饰方法,表示不能被子类重写

final关键字总结

抽象类Abstract

定义:抽象类,使用abstract关键字修饰的类.表示该类只能被继承,不能被实例化

1.基本语法:使用abstract关键字修饰类

//抽象类
abstract class Human{}

2. 抽象类无法实例化

//抽象类
abstract class Human{}

//$h = new Human();//错误:抽象类不能被实例化

3. 抽象类只能被继承

//抽象类
abstract class Human{}

class Man extends Human{}//正确:子类继承抽象父类

4. abstract关键字还可以修饰抽象方法.抽象方法不能有方法体.且有抽象方法的类必须声明为抽象类

5. 抽象方法因为要被子类继承实现,所以不能使用private修饰(私有方法不被继承).

6. 子类继承抽象类后,如果抽象类中有抽象方法,那么子类必须成为抽象类或者自己实现继承父类来的抽象方法(所有抽象方法)

抽象总结

接口interface

定义:接口interface,与类相似,专门用来规范一些共性类必须实现的方法

1. 接口定义:使用interface关键字,后跟接口名字(与类结构一样

interface Human{} //定义接口

2.接口不是类,不可以被实例化:

//错误:接口不能被实例化
//new Human();

3.implements实现接口:接口是类的规范,因此接口只能被类来实现

//只能类来实现接口
class Man implements Human{}

4. 接口成员:接口中只能定义public抽象方法(无须带abstract关键字)和接口常量

接口中允许的方法只能是public抽象的,无须带abstract关键字,带了反而出错!

即:接口中除了接口常量,不能有任何其他具体实现,无论是属性还是方法.因此除了接口常量,它只能拥有抽象方法.

简单助记:(抽象)接口对应抽象方法(除接口常量)

5. 接口必须被具体类实现方法或抽象类"抽象实现"(即不具体实现)

6.实现接口的类成员,不允许重写接口中的常量,不允许增加接口方法的控制权限

7. 接口可以继承extends接口,而且接口允许多继承接口(可以曲线实现类的多继承)

晕,感觉这个多继承例子是演示兽人吗?

接口总结

trait代码复用

定义:trait是为类似php的单继承语言而准备的一种代码复用机制.trait可以使得单继承语言摆脱为了复用而不得不继承的尴尬,让面向对象变得更加纯粹.

1. trait是一种类似class的关键字

trait eat{}

2. trait内部拥有一个类能够拥有的成员属性(包含静态),成员方法(包含静态),但不能有常量.

3.trait是用来代码复用的,不能实例化也不能被继承(不是类)

4. trait是用来将公共代码提供给其他类使用的,而类要使用trait的前提是加载对应的trait

5. 一个类可以使用多个treat

6. 如果同时引入的trait中有同名方法,那么会发生冲突:解决冲突的方法是(A)用insteadof代替处理以及(B)对被替代方法使用别名.

7. 同名覆盖:如果类中有和trait同名的成员==>>属性不允许重名;类的方法覆盖trait的方法.

8. 继承覆盖:子类的父类和子类使用的trait有同名方法,则子类使用的trait的覆盖父类同名方法;如果子类要访问父类同名方法,可以在trait同名方法中使用parent访问父类同名方法.

同名方法覆盖优先级:类自己同名方法 > trait同名方法 > 父类同名方法

子类要访问父类同名方法,在trait同名方法eat()中加入parent::eat();即可访问子类的父类同名方法:

trait Eat{
    public function eat(){
        parent::eat();
    }
}

一般trait较少会预料到和父类有同名方法这种情形,一旦遇到就是这种解决方法.

9. trait不允许自己访问,只是用来给其他类代码复用.因此允许类在使用trait时更高里面方法的访问控制权: 在as之后,使用目标访问修饰符

注意:此时trait中的别名public eshow()方法存在,本尊private show()方法仍然存在!只是访问权限不同.

10. trait中可以使用抽象方法,用来规范使用类必须实现对应抽象方法:使用类要么为抽象类,要么必须实现抽象方法

trait总结:

PHP重载

注意:php重载和其他编程语言的重载不是完全等价.

1. 魔术方法:系统预先设计好的,只需要开发者实现的方法.魔术方法以双下划线__开头.对象在符合某些特定情况下会自动调用.构造方法,析构方法,克隆方法就是魔术方法.

2. php重载是指某些容错处理(为了特定情况系统自动调用),在访问没有权限或者不存在的属性或方法的时候,会自动触发的魔术方法.

  • 属性重载
  • 方法重载

3. 属性重载:当php对象访问不存在的或者没有权限访问的属性的时候会自动触发

  • __get($key):读属性的时候触发
  • __set($key, $value):写属性的时候触发
  • __isset($key):外部调用isset()函数或者empty()函数时自动触发
  • __unset($key):外部调用unset()结构删除对象属性时触发
  • __tostring():对象被当做普通变量输出或者连接时自动调用.
<?php
echo 'php属性重载<br>';

//定义演示类.用到属性重载所有魔术方法
class Human{
	private $age = 10;
	
	//属性重载魔术方法演示
	
	//读取方法
	public function __get($name){
		echo $name, '---', __METHOD__, '<br>';		
	}
	
	//设置方法
	public function __set($name,$value){
		echo $name, ':', $value, '---', __METHOD__, '<br>';		
	}
	
	//判定方法
	public function __isset($name){
		echo $name, '---', __METHOD__, '<br>';		
	}
	
	//删除方法
	public function __unset($name){
		echo $name, '---', __METHOD__, '<br>';		
	}
	
	//tostring方法普通输出
	public function __toString(){
		echo '---', __METHOD__, '<br>';
		return 'toString';			
	}
}

//实例化
$h = new Human();

//访问属性
//触发我们写的__get魔术方法(事件)
//跳过原本php错误机制且中止运行:禁止外部访问private属性
echo $h->age;
//根据private属性外部禁止操作:实际上$age并没有被外部访问	

//设置
//触发我们写的__set魔术方法
//同样跳过php原有错误机制中止程序:禁止外部设置private属性
$h->age=100;
//根据private属性外部禁止操作:实际上$age并没有被外部更改

//判定
//触发我们写的__isset魔术方法并跳过原有错误机制中止程序:禁止外部访问private属性
isset($h->age);

//删除
//触发我们写的__unset魔术方法并跳过原有错误机制中止:禁止外部访问private属性
unset($h->age);
//根据private属性外部禁止操作:实际上age并没有被删除

//普通输出
//触发我们写的__toString魔术方法并跳过原有错误机制中止:不能输出对象
echo $h;

//输出var_dump($h)观察会发现:
//自写的魔术方法会因具体情况由系统自动触发,会跳过php原有错误机制:显示错误信息并中止
//但并不能改变php原有机制:外部禁止访问/更改private属性
var_dump($h);

由上可知:在类外部还是不能访问/修改private属性.但是我们可以在魔术方法(类内部:可以访问所有权限成员)中增添代码突破这一限制,如下.

4. 属性重载的目的:一方面为了不让程序运行出错中止,另一方面可以在类内部由我们自己控制内容的访问

5. 方法重载:访问不存在或禁止访问方法时触发(亦或是某种特殊情况例如构造方法)

  • public __call ( string $name , array $arguments ) : mixed -- 对象调用一个不可访问方法时,__call() 会被调用。
  • public static __callStatic ( string $name , array $arguments ) : mixed -- 类访问不可调用静态方法时,__callStatic() 会被调用。

$name 参数是要调用的方法名称。$arguments 参数是一个枚举数组,包含着要传递给方法 $name 的参数。

6, 方法重载的目的:抑制错误信息,控制自定义访问权限

注:上文有小错误,__callStaic格式应为:public static __callStatic ( string $name , array $arguments )

php重载总结:(php'重载'≠别的编程语言'重载')

对象遍历

定义:遍历对象,其实就是将对象中所有公有属性以键值对的形式取出并进行访问.

1. 使用foreach对对象进行遍历(类外部只显示public属性)

 对象遍历总结:

UsualToolCMS-验证码绕过漏洞复现 本文以UsualToolCMS为靶场,复现了验证码绕过漏洞 阅读详情

相关推荐

西门子Simotion运动控制

SIMOTION

rjimhcd的博客 3023

php中interface接口类,abstract抽象类和trait详解

php中interface接口类,abstract抽象类和trait分别有什么用?他们直接有什么区别?

jkzyx123的博客 910

记一次Redis出问题及解决方案

Q1: redis服务关闭前确认数据还是在的,重启后发现一条数据都没了,key* 查也是空的 A1: 经仔细检查发现redis.conf配置文件配置的数据存储目录配置的是dir ./ 也就是相对目录,也就是说在哪个目录执行redis-server redis.config启动命令 redis数据就会存到哪个目录,同样就会加载哪个目录下的数据文件(dump.rdb),前后两次启动命令的位置不一样导致第二次启动没有加载到(dump.rdb)文件,从而导致查不出数据 Q2:springboot 集成r

u010013928的博客 3058

php trait interface,为什么php的trait不能实现interface

php中为什么trait不能实现interface? 有时候,我们可能会需求使用我们的trait T的所有class都必须实现某interface I,毕竟在每个class中implement I 总没有使用 trait T implements I {} 方便。具体代码interface I {function foo();}trait T implements I {function foo(...

weixin_30980025的博客 280

ADS 使用教程(十八)Encrypting Designs using RFIP Encoder in ADS

在这一节,我们使用RFIP Encoder进行设计加密,这是一种保护知识产权和敏感设计数据的重要方法。RFIP Encoder提供了一种安全的方式来加密设计文件,确保只有授权人员能够访问和使用这些文件。

Dirge19的博客 1169

STM32与K210串口通信

这篇文章是为了填上一篇埋下的坑,k210和STM32通过串口通信,我是采用数据包的形式发送数据的,因为K210发送的数据有几种,采用数据包的形式发送比较安全。本文代码运行的平台是STM32F103C8T6和K210 Dock,只涉及到K210发送数据给STM32,stm32将接受到的数据显示到0.96寸OLED屏上。

qq_70715693的博客 3万+

php抽象类、interface、trait、final

一、抽象类 抽象类的定义 任何一个类,如果它里面至少有一个方法被声明为抽象方法,那么这个类就必须被声明为抽象的,被定义为抽象的方法只是声明了其调用方式(参数),不能定义其具体的功能实现,即抽象方法没有方法体。 抽象类不能被实例化 abstract class AbstractClass { // 强制要求子类定义这些方法 abstract protected function get...

码农Robin的博客 504

Xiaojie雷达之路---毫米波雷达基础知识---中频信号的相位

本篇文章主要介绍毫米波雷达的基础知识中的中频信号的相位 文章目录傅里叶变换的快速回顾中频信号的相位中频信号对物体微小位移的灵敏度如何2个chirps来对一个物体的速度进行测量测量一个振动的物体 傅里叶变换的快速回顾 傅里叶变换是将一个信号从时域中转换到频域中,在时域中的一个正弦信号将在频域中产生一个峰值,在大多数情况下,在频域中的一个信号是一个复数(每个值是一个振幅和相位的向量),表示为AejθAe^{j\theta}Aejθ 在频域中峰值的相位等于正弦函数的初始相位 中频信号的相位 上一篇文章中提到,

XiaoJie的博客 1万+

PHP中interface、abstract、trait定义说明

interface:接口(特殊的抽象类) 应用场景: 1、 制定规范的时候,需要保持类方法的统一性 2、多个平级类需要去实现同样的方法,只是具体的实现方式不一样时(多态) 使用规范: 1、接口不能实例化 2、接口的属性必须是常量 const 3、接口的方法必须是public【默认public】,且不能有函数体 4、接口所有的方法都是抽象方法,类必须实现接口的所有方法 5、一个类可以同时实现多个接...

laogao 522

httprunner V4.3.5 安装与使用--快速上手(超详细-超长篇)

HttpRunner是一款面向 HTTP(S) 协议的通用测试框架,只需编写维护一份 YAML/JSON 脚本,即可实现自动化测试、性能测试、线上监控、持续集成等多种测试需求。继承 Requests 的全部特性,轻松实现 HTTP(S) 的各种测试需求测试用例与代码分离,采用YAML/JSON的形式描述测试场景,保障测试用例具备可维护性测试用例支持分层机制,充分实现测试用例的复用测试用例支持参数化和数据驱动机制使用 skip 机制实现对测试用例的分组执行控制。

Dreams°的博客 3892

PS/Ai/PR/AE等adobe出现正版弹窗提示:Your non-genuine Adobe app will be disabled soon解决办法

就是用专门的清理工具下载,清理工具在文章下方。然后新建三个空的记事本文件,重命名为 Adobe Genuine Launcher.exe,AdobeGCClient.exe,AGMService.exe。在该文件目录中,分别找到 Adobe Genuine Launcher.exe,AdobeGCClient.exe,AGMService.exe,然后在防火墙入站规则里,阻止Adobe Genuine Launcher.exe,AdobeGCClient.exe,AGMService.exe。

Q82556499的博客 1万+

interface、abstract及trait的基本使用

interface接口:一种成员属性为抽象的特殊抽象类,在程序中同为规范的作用。

个人中心 581

强网杯Web题ezphp解题全记录:利用PHP反序列化与条件竞争拿下服务器

本文详细解析了强网杯Web题目ezphp的解题过程,通过PHP反序列化与条件竞争漏洞的组合利用,成功获取服务器权限。文章深入剖析了反序列化链的构造、文件上传绕过技巧以及条件竞争的实际应用,为CTF选手和Web安全研究者提供了宝贵的实战经验。

weixin_29006187的博客 376

02 PHP面向对象高级

转载于:黑马程序员武汉中心 面向对象高级 文章目录**面向对象高级****一、 面向对象三大特性****1、封装****2、继承****3、多态****二、 php继承****1、继承相关概念和实现****2、有限继承****3、重写Override**4、parent关键字**5、php继承特点****6、静态延迟绑定****7、最终类Final****8、抽象类Abstract**9、总结三、...

Keepb1ue的博客 2341

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

PHP高级面对对象

PHP高级面对对象 面对对象三大特性: 封装 继承 多态 封装 : 将数据与对数据的操作绑定到一起 对外界隐蔽 对外部提供可以操作的方法 继承: 面对对象思想中实现代码重复利用的重要特性. 多态: 类继承条件下 同时出现方法下的重写 父类对象对于子类对象的引用 让一个对象同时拥有两种状态 PHP中不支持多态. ...

雪球滚起来的博客 446

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

PHP学习之四:类与对象

1 基础 先看一个简单的类的声明 <?php class SimpleClass { public $a; private $b = 0; protected $c; public function getA() { return $this->a; } } $obj = new SimpleClass()

zzulp的专栏 2224

php随手记

1、语言发展 机器语言 组成:0,1组成的命令 优点:执行效率高 缺点:开发难度大、移植性差、开发成本高 汇编语言 组成:简洁的英文字母和符号 优点:指令简单明了、推广性高 缺点:移植性差、功能简单 高级计算机语言 组成:类似自然语言的符号,系统对程序代码进行编译执 ​ 行,高级语言编程思想分为 面向过程和面向对象 优点:移植性强、可读性强、推广性非常高 缺点:执行效率低 ​ 2、编程思想 面向过程编程 ​ 拆分封装函数实现代码复用,节省开发升本。按照既定方式执行到底,不够灵活 面

yulingfeng59的博客 278

PHP 中的 trait 和它的使用场景到底是怎样的?

/ 定义方法// 定义属性本质Trait 是 PHP 提供的一种「编译时代码复用机制」,通过在类中插入方法和属性,实现水平代码共享。核心价值突破单继承限制:在不改变类继承关系的前提下复用代码。提高代码可维护性:将特定功能封装到 Trait,避免代码重复。一句话理解Trait 就像建筑中的预制构件(如窗户、楼梯),可以被安装到不同的建筑物(类)中,提供统一的功能,而无需每个建筑都重新设计这些构件。

长风破浪会有时的博客 961

php trait interface,关于oop:为什么PHP Trait无法实现接口?

我想知道为什么php特性(php 5.4)不能实现接口。从user1460043的答案更新=>…不能要求使用它来实现特定接口的类我理解这是显而易见的,因为人们可以认为,如果一个Class A使用一个Trait T来实现一个interface I,那么Class A就应该不直接地实现interface I(这不是真的,因为Class A可以重命名特征方法)。在我的例子中,我的特性是从使用特性的...

weixin_32239523的博客 216

PHP中的trait,interface和abstract

一直没找到一篇文章能好好讲解一下PHP中的trait,interface和abstract的异同,今抽时间整理了一下,做一下记录。结合一段代码说明一下,以下是代码: <?php trait MyTrait { protected $var = "MyTrait_var"; protected $var1 = "MyTrait_var"; function __construct

我希望,快乐,在我走过的地方绽放。。。。 6220

php trait 简明教程,多重继承的实现方案

自 PHP 5.4.0 起,PHP 实现了代码复用的一个方法,称为 traits。 Traits 是一种为类似 PHP 的单继承语言而准备的代码复用机制。Trait 为了减少单继承语言的限制,使开发人员能够自由地在不同层次结构内独立的类中复用方法集。Traits 和类组合的语义是定义了一种方式来减少复杂性,避免传统多继承和混入类(Mixin)相关的典型问题。 Trait 和一个类相似,

near的博客 1152

php之新特性trait详解

废话不多说了,直接进入主题吧。 为什么要使用它,使用它有什么好处:        开发人员能够自由地在不同层次结构内独立的类中复用 method,在一定程度上弥补了单继承语言在某些情况下代码不能复用的问题。 与普通类的异同: 相同: trait 能够像普通的类一样定义属性,方法(包含抽象的、静态的、抽象的); trait 引入到基类里面,其子类里面也能访问trait里面的属性和方法。 ...

illusion_you的博客 5345

php interface理解与实例

什么是接口? 接口一听像是微信对外提供的一些功能接口,但在php中接口不是那个意思,下面称接口都是指php中那种接口,关键字是interface. 接口其实是一种规范,在结构中规定一些方法,但不用实现,目的是想让一个类来继承并实现它,严格来说不是继承,就是一个类来实现它。接口中除了方法声明外,还可以有常量 //随意写一个接口 interface Computer{       con

ZYGaLS的博客 4212

php trait特性详解及使用注意事项

php trait特性 简介 自 PHP 5.4.0 起,PHP 实现了一种代码复用的方法,称为 trait。 Trait 是为类似 PHP 的单继承语言而准备的一种代码复用机制。Trait 为了减少单继承语言的限制,使开发人员能够自由地在不同层次结构内独立的类中复用 method。Trait 和 Class 组合的语义定义了一种减少复杂性的方式,避免传统多继承和 Mixin ...

Royal 2581

为什么php的trait不能实现interface

为什么80%的码农都做不了架构师?>>> ...

weixin_33958585的博客 278

详解PHP多继承-trait和接口实现

目录 (1)PHP实现接口多继承 (2)php实现trait多继承 因为无意间有在csdn看到php使用trait多继承的文章,回想起在面试的时候被经常问到php是否支持多继承,答案是否,php只支持单继承,那如何实现多继承呢。我接下来详细说明2种实现php多继承的方法:trait和接口 (1)PHP实现接口多继承 前言: 在PHP的面向对象中,接口可以继承接口。但是PHP类只能继承...

大唐锦绣的博客 1087

php 重载构造函数,如何在PHP> = 5.4中的traits中重载类构造函数

我认为现在唯一的方法来做你想要的是:class MyHelloWorld extends Base {use SayWorld {SayWorld::__construct as private __swConstruct;}public function __construct($a, $b, $c = 0){$this->__swConstruct($a, $b, $c);}}编辑2:我...

weixin_35417196的博客 228
上一篇: 面向对象php学习笔记18:面向对象三大特性,PHP继承[继承概念,有限继承.重写override]
下一篇: 面向对象php学习笔记20:命名空间[命名空间基础,命名空间应用,命名空间引入]
申佳明哥哥
博客等级 码龄10年 39粉丝 84原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值