当前位置: 首页 > news >正文

PHP面向对象编程总结

PHP面向对象编程总结

学习PHP时,面向对象编程(OOP)往往是一个重要的里程碑。PHP的OOP功能提供了一种更加模块化、可扩展和易于维护的代码结构。在本文中,我们将深入探讨PHP面向对象编程的各个方面,包括类与对象、访问控制、继承与多态、抽象类与接口、静态成员与常量、魔术方法、命名空间以及异常处理。

目录

  • PHP面向对象编程总结
    • 1. 类与对象
      • Example
    • 2. 访问控制
      • Example
    • 3. 继承与多态
      • Example
    • 4. 抽象类与接口
      • Example
    • 5. 静态成员与常量
      • Example
    • 6. 魔术方法
      • Example
    • 7. 命名空间
      • Example
    • 8. 异常处理
      • Example
    • 9. 综合案例

1. 类与对象

  • 类(Class):定义对象的模板,包含属性和方法。
  • 对象(Object):类的实例化,具体的实体。
class MyClass {// 属性public $property;// 方法public function method() {// 方法体}
}$obj = new MyClass();

Example

<?php
class MyClass {public $property;public function method() {return "Hello, I'm a method!";}
}$obj = new MyClass();
$obj->property = "I'm a property.";
echo $obj->method(); // 输出: Hello, I'm a method!
echo $obj->property; // 输出: I'm a property.
?>

2. 访问控制

  • 公有(public):可在类的内部和外部访问。
  • 私有(private):仅在类的内部访问。
  • 受保护(protected):仅在类的内部和子类中访问。
class MyClass {public $publicProperty;private $privateProperty;protected $protectedProperty;
}

Example

<?php
class MyClass {public $publicProperty;private $privateProperty;protected $protectedProperty;public function __construct() {$this->publicProperty = "Public property";$this->privateProperty = "Private property";$this->protectedProperty = "Protected property";}
}$obj = new MyClass();
echo $obj->publicProperty; // 输出: Public property
//echo $obj->privateProperty; // 错误: 无法访问私有属性
//echo $obj->protectedProperty; // 错误: 无法访问受保护属性
?>

3. 继承与多态

  • 继承(Inheritance):子类继承父类的属性和方法。
  • 多态(Polymorphism):同一种方法在不同的类中有不同的实现。
class ParentClass {// 父类方法
}class ChildClass extends ParentClass {// 子类方法
}

Example

<?php
class Animal {public function makeSound() {return "Some generic sound";}
}class Dog extends Animal {public function makeSound() {return "Woof!";}
}class Cat extends Animal {public function makeSound() {return "Meow!";}
}$dog = new Dog();
echo $dog->makeSound(); // 输出: Woof!$cat = new Cat();
echo $cat->makeSound(); // 输出: Meow!
?>

4. 抽象类与接口

  • 抽象类(Abstract Class):包含抽象方法的类,不能被实例化。
  • 接口(Interface):定义了一组方法的集合,实现类必须实现这些方法。
abstract class AbstractClass {abstract public function abstractMethod();
}interface MyInterface {public function interfaceMethod();
}

Example

<?php
abstract class Shape {abstract public function getArea();
}class Circle extends Shape {private $radius;public function __construct($radius) {$this->radius = $radius;}public function getArea() {return pi() * pow($this->radius, 2);}
}interface Printable {public function printInfo();
}class Rectangle implements Printable {private $width;private $height;public function __construct($width, $height) {$this->width = $width;$this->height = $height;}public function printInfo() {echo "Rectangle width: $this->width, height: $this->height";}
}$circle = new Circle(5);
echo "Circle area: " . $circle->getArea(); // 输出: Circle area: 78.539816339745$rectangle = new Rectangle(3, 4);
$rectangle->printInfo(); // 输出: Rectangle width: 3, height: 4
?>

5. 静态成员与常量

  • 静态成员(Static Members):属于类而不是对象,可以直接通过类名访问。
  • 常量(Constants):一旦定义就无法更改的值。
class MyClass {public static $staticProperty;const CONSTANT = 'constant value';
}

Example

<?php
class Math {public static $PI = 3.14;public static function double($number) {return $number * 2;}
}echo Math::$PI; // 输出: 3.14
echo Math::double(5); // 输出: 10
?>

6. 魔术方法

  • 构造函数(__construct):对象创建时自动调用。
  • 析构函数(__destruct):对象销毁时自动调用。
  • 其他如 __get, __set, __isset, __unset 等。
class MyClass {public function __construct() {// 构造函数}public function __destruct() {// 析构函数}
}

Example

<?php
class MyClass {public function __construct() {echo "Object created!";}public function __destruct() {echo "Object destroyed!";}
}$obj = new MyClass(); // 输出: Object created!
unset($obj); // 输出: Object destroyed!
?>

7. 命名空间

  • 命名空间(Namespace):用于解决不同类库或模块之间的命名冲突。
namespace MyNamespace;class MyClass {// 类定义
}

Example

<?php
namespace MyNamespace;class MyClass {public function hello() {return "Hello from MyNamespace!";}
}$obj = new MyClass();
echo $obj->hello(); // 输出: Hello from MyNamespace!
?>

8. 异常处理

  • 异常(Exception):运行时发生的错误或异常情况的表示。
try {// 可能发生异常的代码
} catch (Exception $e) {// 异常处理代码
}

Example

<?php
try {// 可能发生异常的代码throw new Exception("An error occurred!");
} catch (Exception $e) {// 异常处理代码echo "Exception caught: " . $e->getMessage(); // 输出: Exception caught: An error occurred!
}
?>

9. 综合案例

<?php
// 定义一个抽象类 Shape
abstract class Shape {abstract public function getArea();
}// 定义一个接口 Printable
interface Printable {public function printInfo();
}// 定义一个圆形类 Circle,继承自抽象类 Shape,并实现 Printable 接口
class Circle extends Shape implements Printable {private $radius;public function __construct($radius) {$this->radius = $radius;}public function getArea() {return pi() * pow($this->radius, 2);}public function printInfo() {echo "This is a circle with radius: $this->radius";}
}// 定义一个矩形类 Rectangle,实现 Printable 接口
class Rectangle implements Printable {private $width;private $height;public function __construct($width, $height) {$this->width = $width;$this->height = $height;}public function getArea() {return $this->width * $this->height;}public function printInfo() {echo "This is a rectangle with width: $this->width and height: $this->height";}
}// 创建一个圆形对象
$circle = new Circle(5);
echo "Circle area: " . $circle->getArea() . "\n"; // 输出: Circle area: 78.539816339745
$circle->printInfo(); // 输出: This is a circle with radius: 5echo "\n";// 创建一个矩形对象
$rectangle = new Rectangle(3, 4);
echo "Rectangle area: " . $rectangle->getArea() . "\n"; // 输出: Rectangle area: 12
$rectangle->printInfo(); // 输出: This is a rectangle with width: 3 and height: 4
?>
  • 在本例中,定义了两个形状类,一个是圆形类 Circle,另一个是矩形类 Rectangle。Circle 类继承了抽象类 Shape 并实现了接口 Printable,而 Rectangle 类则直接实现了接口 Printable。这样我们就可以通过多态的方式统一处理这两种形状类的对象,并调用它们各自的方法。






每一个不曾起舞的日子,都是对生命的辜负。

相关文章:

PHP面向对象编程总结

PHP面向对象编程总结 学习PHP时&#xff0c;面向对象编程&#xff08;OOP&#xff09;往往是一个重要的里程碑。PHP的OOP功能提供了一种更加模块化、可扩展和易于维护的代码结构。在本文中&#xff0c;我们将深入探讨PHP面向对象编程的各个方面&#xff0c;包括类与对象、访问控…...

linux中的“->“符号

问&#xff1a; "->“符号在Linux中是什么意思。 例如&#xff1a;当我在一个特定的文件夹中执行ls -l时&#xff0c;我得到了以下结果。 lrwxrwxrwx 1 root root 11 May 16 13:30 nexus3 -> /nexus-data lrwxrwxrwx 1 root root 29 Feb 27 12:23 ojdbc.jar -&g…...

MySql 数据类型选择与优化

选择优化的数据类型 更小的通常更好 一般情况下尽量使用可以正确存储数据的最小类型。更小的数据类型通常更快&#xff0c;因为它们占用更少的磁盘&#xff0c;内存和CPU缓存&#xff0c;并且处理时需要的CPU周期也更少。但也要确保没有低估需要存储值的范围。 简单就好 简单的…...

HTML静态网页成品作业(HTML+CSS)——家乡常德介绍网页(1个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0c;共有1个页面。 二、作品演示 三、代…...

【ARMv7-A】——CP15 协处理器

文章目录 CP15 协处理器指令格式MCR 示例MRC 示例寄存器C0 identification registersC1 system control registersC2 memory protection and control registersC3 memory protection and control registersC4 Not usedC5 Memory system fault registers...

学习笔记:(2)荔枝派Nano开机显示log(全志F1C200S)

学习笔记:TF卡启动荔枝派Nano(全志F1C200S) 1.u-boot配置2.需要配置LCD的显示设备树1.u-boot配置 ARM architecture Enable graphical uboot console on HDMI, LCD or VGAx:480,y:272,depth:...

Qt——升级系列(Level Two):Hello Qt 程序实现、项目文件解析、

Hello Qt 程序实现 使用“按钮”实现 纯代码方式实现&#xff1a; // Widget构造函数的实现 Widget::Widget(QWidget *parent): QWidget(parent) // 使用父类构造函数初始化QWidget&#xff0c;传入父窗口指针, ui(new Ui::Widget) // 创建Ui::Widget类的实例&#xff0c;并…...

VUE阻止浏览器记住密码若依CLOUD(INPUT框密码替换圆点)

网上找的要不就是缺少方法要不就是不好用,故发一个完整的 粘贴可用版本 <el-form-item prop"password"><el-input v-model"loginForm.pwdCover" type"text" name"pwd" id"pwd" placeholder"密码" autoco…...

GPT-4o:人工智能新纪元的启航者

引言 随着人工智能技术的不断进步&#xff0c;我们见证了从简单的自动化工具到复杂的决策支持系统的演变。在这一演变过程中&#xff0c;OpenAI的GPT系列无疑占据了领导地位。最近&#xff0c;GPT-4o的推出再次引发了关于AI能力的广泛讨论。本文将对GPT-4o进行详细评价&#x…...

CSRF跨站请求伪造漏洞

CSRF跨站请求伪造漏洞 1.CSRF漏洞概述2.防御CSRF攻击3.CSRF防御绕过CSRF令牌未绑定到用户会话自定义标头令牌绕过绕过Referer检查关键词绕过 4.利用示例使用HTML标签进行GET表单 GET 请求表单POST请求通过 iframe 发送表单 POST 请求Ajax POST 请求 5.CSRF BP 验证方法6.CSRF测…...

【Linux】System V 消息队列(不重要)

一、消息队列的原理 一个进程给另一个进程发送类型数据块的方式每一个数据快都被认为是有一个类型的&#xff0c;接收者进程接收的数据快可以有不同的类型值 二、消息队列的接口 和共享内存的接口很像&#xff1a; 消息队列的创建 创建消息队列我们需要用msgget函数&#x…...

label标签

01、label标签 概述 label标签页属于&#xff1a;form元素的成员之一&#xff0c;它有啥意义呢&#xff1f;它主要用来修饰文本和form元素的指向和体验问题。我们只需要把文本和form元素使用label标签包裹&#xff0c;就可以产生一个奇妙的化学反应。就是&#xff1a;我们点击…...

vruntime

vruntime vruntime 变量存放进程的虚拟运行时间,虚拟时间是以 ns 为单位的,which is the actual runtime (the amount of time spent running) normalized (or weighted) by the number of runnable processesvruntime 和定时器节拍不再相关。优先级相同的所有进程的虚拟运行时…...

!力扣 108. 将有序数组转换为二叉搜索树

给你一个整数数组 nums &#xff0c;其中元素已经按升序排列&#xff0c;请你将其转换为一棵 平衡二叉搜索树。 示例 1&#xff1a; 输入&#xff1a;nums [-10,-3,0,5,9] 输出&#xff1a;[0,-3,9,-10,null,5] 解释&#xff1a;[0,-10,5,null,-3,null,9] 也将被视为正确答案…...

13、matlab使用switch case语句实现两个数字的加减乘除运算以及数据的输入输出(可以设置计算次数)

1、不同数据的键盘输入 函数&#xff1a;input() 代码&#xff1a; a input(请输入一个数字: );%输入数字 c input(请输入一个运算符号: ,s);%输入字符 b input(请输入一个数字: );%输入数字 请输入一个数字: 1 请输入一个运算符号: 请输入一个数字: 2 2、 格式化输出 …...

数学建模 —— 聚类分析(3)

目录 一、聚类分析概述 1.1 常用聚类要素的数据处理 1.1.1 总和标准化 1.1.2 标准差标准化 1.1.3 极大值标准化 1.1.4 极差的标准化 1.2 分类 1.2.1 快速聚类法&#xff08;K-均值聚类&#xff09; 1.2.2 系统聚类法&#xff08;分层聚类法&#xff09; 二、分类统计…...

java —— 匿名内部类与 Lambda 表达式

一、匿名内部类 匿名内部类是一种没有名称的类&#xff0c;多用于只使用一次的情况&#xff0c;本质上就是其所继承的父类或接口的一个子类。 &#xff08;一&#xff09;继承普通类的情况 public class Test{public void method(){System.out.println("通用方法"…...

对红黑树、跳表、B+树的一些理解

文章目录 红黑树应用场景 跳表使用场景 B树使用场景 毫无疑问数据结构是复杂的&#xff0c;让人头大的&#xff0c;大学时唯一挂科的就是数据结构&#xff0c;上学时不用心&#xff0c;不晓得自己的职业生涯要一直被数据结构支配。 或多或少&#xff0c;面试抱佛脚时&#xff0…...

C++ deque 双端队列

deque原理介绍 deque(双端队列)&#xff1a;是一种双开口的"连续"空间的数据结构&#xff0c;双开口的含义是&#xff1a;可以在头尾两端进行插入和删除操作&#xff0c;且时间复杂度为O(1)。 与vector比较&#xff0c;头插效率高&#xff0c;不需要搬移元素&#xf…...

Java | Leetcode Java题解之第127题单词接龙

题目&#xff1a; 题解&#xff1a; class Solution {Map<String, Integer> wordId new HashMap<String, Integer>();List<List<Integer>> edge new ArrayList<List<Integer>>();int nodeNum 0;public int ladderLength(String beginW…...

地震勘探——干扰波识别、井中地震时距曲线特点

目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波&#xff1a;可以用来解决所提出的地质任务的波&#xff1b;干扰波&#xff1a;所有妨碍辨认、追踪有效波的其他波。 地震勘探中&#xff0c;有效波和干扰波是相对的。例如&#xff0c;在反射波…...

vscode(仍待补充)

写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh&#xff1f; debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...

基于Docker Compose部署Java微服务项目

一. 创建根项目 根项目&#xff08;父项目&#xff09;主要用于依赖管理 一些需要注意的点&#xff1a; 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件&#xff0c;否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...

推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)

推荐 github 项目:GeminiImageApp(图片生成方向&#xff0c;可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...

【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论

路径问题的革命性重构&#xff1a;基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中&#xff08;图1&#xff09;&#xff1a; mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...

MFC 抛体运动模拟:常见问题解决与界面美化

在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...

LabVIEW双光子成像系统技术

双光子成像技术的核心特性 双光子成像通过双低能量光子协同激发机制&#xff0c;展现出显著的技术优势&#xff1a; 深层组织穿透能力&#xff1a;适用于活体组织深度成像 高分辨率观测性能&#xff1a;满足微观结构的精细研究需求 低光毒性特点&#xff1a;减少对样本的损伤…...

第7篇:中间件全链路监控与 SQL 性能分析实践

7.1 章节导读 在构建数据库中间件的过程中&#xff0c;可观测性 和 性能分析 是保障系统稳定性与可维护性的核心能力。 特别是在复杂分布式场景中&#xff0c;必须做到&#xff1a; &#x1f50d; 追踪每一条 SQL 的生命周期&#xff08;从入口到数据库执行&#xff09;&#…...

Vue 模板语句的数据来源

&#x1f9e9; Vue 模板语句的数据来源&#xff1a;全方位解析 Vue 模板&#xff08;<template> 部分&#xff09;中的表达式、指令绑定&#xff08;如 v-bind, v-on&#xff09;和插值&#xff08;{{ }}&#xff09;都在一个特定的作用域内求值。这个作用域由当前 组件…...