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时,面向对象编程(OOP)往往是一个重要的里程碑。PHP的OOP功能提供了一种更加模块化、可扩展和易于维护的代码结构。在本文中,我们将深入探讨PHP面向对象编程的各个方面,包括类与对象、访问控…...
linux中的“->“符号
问: "->“符号在Linux中是什么意思。 例如:当我在一个特定的文件夹中执行ls -l时,我得到了以下结果。 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 数据类型选择与优化
选择优化的数据类型 更小的通常更好 一般情况下尽量使用可以正确存储数据的最小类型。更小的数据类型通常更快,因为它们占用更少的磁盘,内存和CPU缓存,并且处理时需要的CPU周期也更少。但也要确保没有低估需要存储值的范围。 简单就好 简单的…...
HTML静态网页成品作业(HTML+CSS)——家乡常德介绍网页(1个页面)
🎉不定期分享源码,关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 🏷️本套采用HTMLCSS,未使用Javacsript代码,共有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 程序实现 使用“按钮”实现 纯代码方式实现: // Widget构造函数的实现 Widget::Widget(QWidget *parent): QWidget(parent) // 使用父类构造函数初始化QWidget,传入父窗口指针, ui(new Ui::Widget) // 创建Ui::Widget类的实例,并…...
VUE阻止浏览器记住密码若依CLOUD(INPUT框密码替换圆点)
网上找的要不就是缺少方法要不就是不好用,故发一个完整的 粘贴可用版本 <el-form-item prop"password"><el-input v-model"loginForm.pwdCover" type"text" name"pwd" id"pwd" placeholder"密码" autoco…...
GPT-4o:人工智能新纪元的启航者
引言 随着人工智能技术的不断进步,我们见证了从简单的自动化工具到复杂的决策支持系统的演变。在这一演变过程中,OpenAI的GPT系列无疑占据了领导地位。最近,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 消息队列(不重要)
一、消息队列的原理 一个进程给另一个进程发送类型数据块的方式每一个数据快都被认为是有一个类型的,接收者进程接收的数据快可以有不同的类型值 二、消息队列的接口 和共享内存的接口很像: 消息队列的创建 创建消息队列我们需要用msgget函数&#x…...
label标签
01、label标签 概述 label标签页属于:form元素的成员之一,它有啥意义呢?它主要用来修饰文本和form元素的指向和体验问题。我们只需要把文本和form元素使用label标签包裹,就可以产生一个奇妙的化学反应。就是:我们点击…...
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 ,其中元素已经按升序排列,请你将其转换为一棵 平衡二叉搜索树。 示例 1: 输入:nums [-10,-3,0,5,9] 输出:[0,-3,9,-10,null,5] 解释:[0,-10,5,null,-3,null,9] 也将被视为正确答案…...
13、matlab使用switch case语句实现两个数字的加减乘除运算以及数据的输入输出(可以设置计算次数)
1、不同数据的键盘输入 函数:input() 代码: 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 快速聚类法(K-均值聚类) 1.2.2 系统聚类法(分层聚类法) 二、分类统计…...
java —— 匿名内部类与 Lambda 表达式
一、匿名内部类 匿名内部类是一种没有名称的类,多用于只使用一次的情况,本质上就是其所继承的父类或接口的一个子类。 (一)继承普通类的情况 public class Test{public void method(){System.out.println("通用方法"…...
对红黑树、跳表、B+树的一些理解
文章目录 红黑树应用场景 跳表使用场景 B树使用场景 毫无疑问数据结构是复杂的,让人头大的,大学时唯一挂科的就是数据结构,上学时不用心,不晓得自己的职业生涯要一直被数据结构支配。 或多或少,面试抱佛脚时࿰…...
C++ deque 双端队列
deque原理介绍 deque(双端队列):是一种双开口的"连续"空间的数据结构,双开口的含义是:可以在头尾两端进行插入和删除操作,且时间复杂度为O(1)。 与vector比较,头插效率高,不需要搬移元素…...
Java | Leetcode Java题解之第127题单词接龙
题目: 题解: 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…...
iFakeLocation终极指南:3分钟实现iOS虚拟定位的完整教程
iFakeLocation终极指南:3分钟实现iOS虚拟定位的完整教程 【免费下载链接】iFakeLocation Simulate locations on iOS devices on Windows, Mac and Ubuntu. 项目地址: https://gitcode.com/gh_mirrors/if/iFakeLocation 想在iOS设备上轻松模拟任意位置吗&…...
3分钟掌握Godot游戏资源解包:免费开源工具快速提取PCK文件
3分钟掌握Godot游戏资源解包:免费开源工具快速提取PCK文件 【免费下载链接】godot-unpacker godot .pck unpacker 项目地址: https://gitcode.com/gh_mirrors/go/godot-unpacker 还在为Godot游戏中的资源文件无法访问而烦恼吗?想要学习优秀游戏的…...
巴洛克光影建模失败率高达83%?用这7个构图锚点+12组权威艺术史关键词立即逆转
更多请点击: https://kaifayun.com 第一章:巴洛克光影建模的危机本质与历史断层 “巴洛克光影建模”并非真实存在的技术流派,而是对20世纪末至21世纪初三维渲染实践中一种高度装饰化、过度依赖手工打光与物理不一致材质叠加现象的隐喻性指称…...
被遗忘的女程序员沙拉:用模拟程序为互联网奠基,却因家庭放弃编程
为互联网奠基的女程序员沙拉 数学教师沙拉博姆利用暑假编写代码,她之后开发的东西最终演变成了互联网。作者包括凯蒂哈夫纳、萨米亚布齐德、劳拉伊森西以及科学领域被遗忘的女性倡议组织。 沙拉的编程之路 沙拉博姆从加州大学洛杉矶分校获得教学学位后,投…...
如何用Win11Debloat免费为Windows系统瘦身:终极优化指南
如何用Win11Debloat免费为Windows系统瘦身:终极优化指南 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes to declutter and …...
Jellyfin Android TV客户端:打造家庭影院的终极大屏解决方案
Jellyfin Android TV客户端:打造家庭影院的终极大屏解决方案 【免费下载链接】jellyfin-androidtv Android TV Client for Jellyfin 项目地址: https://gitcode.com/gh_mirrors/je/jellyfin-androidtv Jellyfin Android TV客户端是一款专为智能电视和流媒体设…...
从CT扫描到AI模型:避开DICOM体位信息这个‘隐形坑’,提升医学影像分析准确率
从CT扫描到AI模型:避开DICOM体位信息这个‘隐形坑’,提升医学影像分析准确率 在医疗AI模型的开发过程中,数据预处理环节往往被工程师们视为"脏活累活"——既没有模型调参的成就感,也不如算法设计那样引人注目。然而&…...
Box64终极指南:如何在ARM设备上轻松运行x86程序?三个简单步骤解锁无限可能
Box64终极指南:如何在ARM设备上轻松运行x86程序?三个简单步骤解锁无限可能 【免费下载链接】box64 Box64 - Linux Userspace x86_64 Emulator with a twist, targeted at ARM64, RV64 and LoongArch Linux devices 项目地址: https://gitcode.com/gh_m…...
把闲置NAS变成数据中枢:Docker部署MySQL全流程与Python连接实战
把闲置NAS变成数据中枢:Docker部署MySQL全流程与Python连接实战 家里那台吃灰的NAS,除了存电影和备份照片,还能干点更有技术含量的事吗?当然可以!今天我们就来彻底激活它的潜力,将它打造成家庭数据处理的&q…...
ComfyUI Manager完全指南:AI绘画插件管理从未如此简单
ComfyUI Manager完全指南:AI绘画插件管理从未如此简单 【免费下载链接】ComfyUI-Manager ComfyUI-Manager is an extension designed to enhance the usability of ComfyUI. It offers management functions to install, remove, disable, and enable various custo…...
