PHP代码审计基础——属性访问控制(抽象类、接口、静态方法)
这篇笔记把 PHP 面向对象里几个最容易混的基础概念理了一遍。先是访问控制的边界public 对外、protected 留给类和子类、private 只限本类。接着区分 interface 和 abstract class 各自的职责——前者定规范解决有什么后者给可复用的基础实现解决怎么做。最后过了一下 static 和 final一个是不用实例化就能共享调用的机制一个是给关键方法和类加上的不可覆盖、不可继承的约束。文章目录访问控制1. public可以在外部调用2. protected和private可以在内部调用3. 继承子类也可以调用protected和private4. 子类可以对可以对public 和protected 进⾏重定义但private不行5. 方法的访问控制接口抽象类static 关键字代码示例注意事项final 关键字final 方法禁止子类重写final 类禁止被继承总结访问控制PHP 对属性或方法的访问控制是通过在前面添加关键字 public公有protected受保护或 private私有来实现public公有公有的类成员可以在任何地方被访问。protected受保护受保护的类成员则可以被其自身以及其子类和父类访问。private私有私有的类成员则只能被其定义所在的类访问。1. public可以在外部调用类属性必须定义为公有受保护私有之一。如果用 var 定义则被视为公有public的这里我们举个例子看看2. protected和private可以在内部调用但是如果我们在Class A里添加一个函数让其输出$protected 和 $private 对象可以成功吗我们来试试从结果我们可以看到是可以输出的3. 继承子类也可以调用protected和private得到结果如下4. 子类可以对可以对public 和protected 进⾏重定义但private不行?phpclassA{public$publicpublic;var$public2public2;# var默认就是public属性两者效果等同protected$protectedprotected;# 修正了这里的拼写补上了private$privateprivate;functionP(){# public protected private都可以在Class内部进行访问echo$this-public.\n;echo$this-protected.\n;# 修正了这里的拼写echo$this-private.\n;}}$zhangsannewA();//echo $zhangsan-public; # 可以在外部调用//echo $zhangsan-protected; # 会产生致命错误//echo $zhangsan-private; # 会产生致命错误# 使用函数P//$zhangsan-P();ClassBextendsA{# 可以对 public 和 protected 进行重定义但 private 而不能public$publicpublic_is_well;protected$protectedprotected_is_well;private$privateprivate_is_well;}$lisinewB();echo$lisi-public.\n;// 这行能被正常执行输出: public_is_well// echo $lisi-private; // 这行会产生致命错误 (Cannot access private property)// echo $lisi-protected; // 这行也会产生致命错误 (Cannot access protected property)$lisi-P();// 输出: public_is_well, protected_is_well 和 private5. 方法的访问控制因为与上述例子类似所以这里直接放代码类中的⽅法可以被定义为公有私有或受保护。如果没有设置这些关键字则该⽅法默认为公有。?phpclassMyClass{public$publicPublic;protected$protectedProtected;private$privatePrivate;functionprintHello(){echo$this-public;echo$this-protected;echo$this-private;}}$objnewMyClass();echo$obj-public;// 这行能被正常执行echo$obj-protected;// 这行会产生一个致命错误echo$obj-private;// 这行也会产生一个致命错误$obj-printHello();// 输出 Public、Protected 和 Private/** * Define MyClass2 */classMyClass2extendsMyClass{// 可以对 public 和 protected 进行重定义但 private 而不能protected$protectedProtected2;functionprintHello(){echo$this-public;echo$this-protected;echo$this-private;}}$obj2newMyClass2();echo$obj2-public;// 这行能被正常执行echo$obj2-private;// 未定义 privateecho$obj2-protected;// 这行会产生一个致命错误$obj2-printHello();// 输出 Public、Protected2 和 Undefined?接口使用接口interface可以指定某个类必须实现哪些方法但不需要定义这些方法的具体内容。接口是通过interface 关键字来定义的就像定义一个标准的类一样但其中定义所有的方法都是空的。接口中定义的所有方法都必须是公有这是接口的特性。要实现一个接口使用implements操作符。类中必须实现接口中定义的所有方法否则会报一个致命错误。类可以实现多个接口用逗号来分隔多个接口的名称。举个例子我们现在定义一个接口Template并尝试让类 A 去实现implements这个接口如何修正代码如果一个类实现了某个接口就必须把该接口中定义的所有方法全部实现补全具体的代码逻辑完整代码如下?php// 1. 定义接口只规范“有什么功能”不写具体实现interfaceTemplate{publicfunctionSetName($name);publicfunctionGetName();}// 2. 实现接口必须把接口里的每个方法都写出来classAimplementsTemplate{private$name;// 实现 SetName 方法publicfunctionSetName($name){$this-name$name;}// 实现 GetName 方法publicfunctionGetName(){return$this-name;}}// 3. 实例化与使用$objnewA();$obj-SetName(张三);echo$obj-GetName();// 输出: 张三抽象类任何一个类如果它里面至少有一个方法是被声明为抽象的那么这个类就必须被声明为抽象的。定义为抽象的类不能被实例化。被定义为抽象的方法只是声明了其调用方式参数不能定义其具体的功能实现。继承一个抽象类的时候子类必须定义父类中的所有抽象方法另外这些方法的访问控制必须和父类中一样或者更为宽松。例如某个抽象方法被声明为protected的那么子类中实现的方法就应该声明为protected的或者pbulic的而不能定义为private的也就是比父类更为“宽松”此外方法的调用方式必须匹配即类型和所需参数数量必须一致。例如子类定义了一个可选参数而父类抽象方法的声明里没有则两者的声明并无冲突。?php// 1. 定义抽象类抽象类就像一个未完成的模板不能直接 newabstractclassAnimal{// 普通方法子类可以直接用publicfunctioneat(){echo动物在吃东西\n;}// 抽象方法只定义名字没有具体内容强制要求子类去实现它abstractpublicfunctionmakeSound();}// 抽象类不能被实例化这行会报错$a new Animal();// 2. 继承抽象类子类必须把父类的抽象方法写出来classDogextendsAnimal{// 实现父类的抽象方法publicfunctionmakeSound(){echo汪汪汪\n;}}classCatextendsAnimal{// 实现父类的抽象方法publicfunctionmakeSound(){echo喵喵喵\n;}}// 3. 实例化子类并使用$dognewDog();$dog-eat();// 输出动物在吃东西继承的方法$dog-makeSound();// 输出汪汪汪子类实现的方法$catnewCat();$cat-makeSound();// 输出喵喵喵static 关键字在 PHP 中使用static静态修饰类属性或方法后这些成员就属于类本身而不是某个具体的对象实例。因此可以不实例化类直接通过类名::成员的方式访问。静态属性不能通过一个已实例化的对象来访问但静态方法可以。静态方法不需要通过对象调用因此伪变量$this在静态方法中不可用。静态属性不可以由对象通过-操作符访问。自PHP 5.3.0起可以用一个变量来动态调用类但该变量的值不能是关键字self、parent或static。代码示例?phpclassFoo{// 静态属性属于类本身publicstatic$my_staticfoo;// 普通方法通过 self::$my_static 访问类本身的静态属性publicfunctionstaticValue(){returnself::$my_static;}}// 不实例化直接用 类名::静态属性 访问printFoo::$my_static.PHP_EOL;$foonewFoo();// 通过对象调用普通方法方法内部访问静态属性print$foo-staticValue().PHP_EOL;?注意事项访问静态属性必须用Foo::$my_static形式不能写成$foo-my_static或$foo-$my_static。在静态方法里不要使用$this需要访问自身静态成员时用self::或static::后期静态绑定。final 关键字final是 PHP 5 引入的关键字用于锁定类或方法防止被进一步修改或扩展父类中被声明为final的方法子类无法覆盖重写。被声明为final的类不能被继承。final 方法禁止子类重写下面这段代码执行时会直接报错因为子类试图重写父类的 final 方法?phpclassBaseClass{publicfunctiontest(){echoBaseClass::test() called.PHP_EOL;}// final 方法子类不可重写finalpublicfunctionmoreTesting(){echoBaseClass::moreTesting() called.PHP_EOL;}}classChildClassextendsBaseClass{publicfunctionmoreTesting(){// 报错echoChildClass::moreTesting() called.PHP_EOL;}}// Fatal error: Cannot override final method BaseClass::moreTesting()?final 类禁止被继承如果把final加在类上则整个类都不能作为父类?phpfinalclassUltimateClass{publicfunctionshow(){echo这是一个不能被继承的终极类\n;}}// Fatal error: Class SubClass may not inherit from final class// class SubClass extends UltimateClass {}?总结这篇笔记把 PHP 面向对象里几个最容易混的基础概念理了一遍。先是访问控制的边界public 对外、protected 留给类和子类、private 只限本类。接着区分 interface 和 abstract class 各自的职责——前者定规范解决有什么后者给可复用的基础实现解决怎么做。最后过了一下 static 和 final一个是不用实例化就能共享调用的机制一个是给关键方法和类加上的不可覆盖、不可继承的约束。

相关新闻

TMS320F2837xD USB与uPP外设中断与DMA配置实战解析

TMS320F2837xD USB与uPP外设中断与DMA配置实战解析

1. 项目概述与核心价值在嵌入式系统,尤其是像TI TMS320F2837xD这样的高性能实时微控制器开发中,如何高效、可靠地管理外设通信,是决定系统整体性能与稳定性的关键。我们常常面临一个核心矛盾:CPU需要处理复杂的控制算法和实时任务…

2026/10/19 19:50:05 阅读更多 →
Jellium Desktop网络带宽限制设置:控制最大下载速度的完整指南

Jellium Desktop网络带宽限制设置:控制最大下载速度的完整指南

Jellium Desktop网络带宽限制设置:控制最大下载速度的完整指南 【免费下载链接】jellium-desktop An unofficial desktop client for Jellyfin 项目地址: https://gitcode.com/GitHub_Trending/je/jellium-desktop Jellium Desktop是一款功能强大的Jellyfin非…

2026/10/20 10:27:40 阅读更多 →
X-StereoLab与PyTorch深度集成:分布式训练的实现原理与代码示例

X-StereoLab与PyTorch深度集成:分布式训练的实现原理与代码示例

X-StereoLab与PyTorch深度集成:分布式训练的实现原理与代码示例 【免费下载链接】X-StereoLab SOS IROS 2018 GOOGLE; StereoNet ECCV2018 GOOGLE; ActiveStereoNet ECCV2018 Oral GOOGLE; HITNET CVPR2021 GOOGLE;PLUME Uber ATG 项目地址: https://g…

2026/10/20 13:39:33 阅读更多 →

最新新闻

Python+MySQL学生管理系统:可视化界面落地与避坑指南

Python+MySQL学生管理系统:可视化界面落地与避坑指南

简介:这是一套面向Python与数据库初学者的学生管理系统实战项目,采用Python编写客户端逻辑、MySQL负责数据存储,适合正在学习桌面应用开发或需要完成课程设计的学生参考。压缩包共2个文件,包含1个py主程序与1个sql数据库脚本&…

2026/10/20 17:19:49 阅读更多 →
MySQL反斜杠转义全解析:从字符串插入到LIKE查询的避坑指南

MySQL反斜杠转义全解析:从字符串插入到LIKE查询的避坑指南

先交代一个真实翻车现场。有天业务方发来一张截图,某张配置表里的 Windows 路径字段,原本应该是C:\Users\某应用目录\data\config.ini,结果库里存成了C:Users某应用目录dataconfig.ini,所有反斜杠集体失踪。我一开始以为是应用层写…

2026/10/20 17:19:49 阅读更多 →
电商评论情感分析实战:从数据清洗到BERT蒸馏部署全记录

电商评论情感分析实战:从数据清洗到BERT蒸馏部署全记录

这个项目标题一看就是从实战里踩出来的,数据坑、部署、硬核笔记,说明作者真刀真枪跑过完整链路,不是拿公开数据集跑个demo就完事。文本分类和情感分析在NLP里属于入门必练但做好极难的方向,难就难在数据永远是脏的、标签永远是偏的…

2026/10/20 17:19:49 阅读更多 →
TensorFlow工业级AI工程实践:从计算图到TFX流水线

TensorFlow工业级AI工程实践:从计算图到TFX流水线

1. 这不是“学个框架”那么简单:TensorFlow到底在解决什么问题?很多人第一次听说TensorFlow,是在某次技术分享会上听到“谷歌开源的深度学习框架”,或者在招聘JD里看到“熟悉TensorFlow者优先”。但如果你真去翻它的GitHub仓库、读…

2026/10/20 17:19:49 阅读更多 →
双线性插值原理与C语言实现:图像缩放算法详解

双线性插值原理与C语言实现:图像缩放算法详解

简介:这份资源围绕双线性插值方法及实现展开,面向图像处理、计算机图形学与数值计算方向的学习者,尤其适合希望用C语言理解插值数学原理并动手实现的开发者。包内共31个文件,以h头文件、cpp源文件、obj目标文件为主,辅…

2026/10/20 17:19:49 阅读更多 →
Prescan+Simulink+CarSim联仿:多工况自动驾驶避障模型搭建与标定实战

Prescan+Simulink+CarSim联仿:多工况自动驾驶避障模型搭建与标定实战

做自动驾驶避障仿真的人,迟早会跟三个名字绑在一起:Prescan、Simulink、CarSim。标题里那套“不同工况避障模型”,说白了就是让一辆装有虚拟传感器的车,在模拟道路环境里遇到静止车、前车急减速、旁边车道突然切进来、行人横穿这些…

2026/10/20 17:18:48 阅读更多 →

日新闻

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
ESP32舵机控制指南:原理、多路驱动与避坑实战

ESP32舵机控制指南:原理、多路驱动与避坑实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
位移法实现一阶低通滤波:单片机ADC采样降噪实战

位移法实现一阶低通滤波:单片机ADC采样降噪实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/19 17:32:41 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 10:02:08 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:45 阅读更多 →