PHP面向对象01:面向对象基础
PHP面向对象01:面向对象基础
- 一、关键字说明
- 二、技术实现
- 1. 定义类
- 2. 类成员
- 三、 访问修饰限定符
- 1. public
- 2. protected
- 3. private
- 4. 空修饰限定符
- 四、类内部对象
- 五、构造和析构
- 1. 构造方法
- 2. 析构方法
- 六、范围解析操作符
- 1. 访问类常量
- 2. 静态成员
- 3. self关键字
- 七、类的加载
- 1. 手动加载
- 2. 自动加载
- 八、对象克隆
一、关键字说明
- class:类。
- object:对象,也称实例。
- new:实例化。
- member:类成员。
- method:方法,也称成员方法。
- property:属性,也称成员变量。
- constant:类常量。
二、技术实现
1. 定义类
- 定义类基本语法:
class 类名 {}
<?php
# 定义类
class Nothing {}
# 实例化对象
$nothing = new Nothing;var_dump($nothing);
数据类型为对象,对象属于Nothing类,编号为1,当前对象里面有0个属性。
2. 类成员
- 指直接定义在类结构内部的以及成员,即直接依赖{}的成员。
- 分为三种:成员变量、成员方法、类常量。
-
成员变量:
- 需要在变量名字前使用关键字 public。
- 语法:
public 变量名 [=值];
class Nothing {public $a;public $b = 1; }
- 访问方式:
$对象名->属性名;
# 实例化对象 $nothing = new Nothing;# 增 $nothing->c = 20; # 删 unset($nothing->a); # 改 $nothing->b = -1; # 查 echo $nothing->b;
-
成员方法:
- 在类结构{}下定义的函数。
class Salar {public function display() {echo __CLASS__;} }
- 成员方法访问:
$对象名->方法名();
$s = new Salar(); $s->display();
-
类常量:
- 定义方式:
const 常量名 = 值;
class Saler {const PI = 3.14; }
- 类常量不能由对象来进行访问。
- 定义方式:
三、 访问修饰限定符
- 用来控制属性或方法的访问位置。
- 分为三种:public、protected、private。
- 多使用private,少使用public。
1. public
- 表示公有,所修饰的内容可以在任何地方都可访问。
2. protected
- 受保护,只能在当前类和相关类的内部访问。
3. private
- 私有,只能在当前类的内部访问。
4. 空修饰限定符
- 只有方法可以省略修饰限定符,默认为public。
- 不建议省略。
四、类内部对象
- $this是内置对象,代表的是对象。
- $this不受修饰限定符影响。
五、构造和析构
1. 构造方法
- 构造方法:
__construct()
,是一种类结构特有的特殊方法,实例化对象时,对象自动调用。
class Person{public function __construct() {echo __CLASS__;}
}
- 初始化属性
2. 析构方法
- 析构方法
__destruct
在对象被销毁时会自动调用。 - 使用析构方法的情况:
- 保存对象的变量被用来保存其他数据,导致对象内存没有任何变量引用。
- 删除对象变量。
- 脚本执行结束,释放所有变量。
<?php
class Saler{public function __destruct(){echo __FUNCTION__;}
}$saler = new Saler();
unset($saler);
六、范围解析操作符
- 由两个冒号组成
::
,可以实现类直接访问类成员。格式:类名::类成员
- 如果需要有一些自身的数据和操作(类常量、静态成员),由类来访问。属性和方法由对象访问。
1. 访问类常量
class Saler {const PI = 3.14;
}
echo Saler::PI;
2. 静态成员
- 静态成员,是由static关键字修饰的类成员,表示该成员属于类访问。
- 不建议使用对象访问带 static 的静态成员。
- 多用静态,少用非静态。
- 静态属性:
<?php class Person{public $money = 0;public static $count = 0; }$person = new Person(); // 访问成员属性 echo $person->money; echo "<br>"; // 访问静态属性 echo Person::$count;
- 静态方法:
<?php class Person{public static $count = 0;public static function showCount() {echo Person::$count, __FUNCTION__;} } Person::showCount();
3. self关键字
- 静态成员中不能使用
$this
,只能使用self
self
关键字在类的内部使用,用于代替类名。
<?php
class Person{private static $count = 0;public static function showClass() {echo Person::$count;echo self::$count; // self代替类名}
}
Person::showClass();
- 当构造方法被私有化,就没法在类外部实例化对象,此时可以在类内部进行对象实例化。
<?php
class Person{private function __construct() { }public static function getInstance() {return new self();}
}$person = Person::getInstance();
七、类的加载
1. 手动加载
- 即要访问某个类之前,使用文件包含将类所在的文件加载进来
- 加载类文件比较消耗资源,所以事先用
class_exists()
来判断是否存在。
<?php
if (!class_exists("Saler")) {include_once "Saler.php";
}
$saler = new Saler();
2. 自动加载
- 自动加载是PHP提供的一种加载机制。
- php7以前:实现定义一个函数
__autoload()
,然后当系统需要实用类,而内存中不存在的时候,系统会自动调用__autoload()
来加载类文件。 - php7以后:自动加载通过
spl_autoload_register()
实现<?php class Autoload{function c_autoload($class) {$c_file = 'c/' . $class . '.php';if (file_exists($c_file)) require_once $c_file;}function d_autoload($class) {$c_file = 'd/' . $class . '.php';if (file_exists($c_file)) require_once $c_file;} }spl_autoload_register(array("Autoload", "c_autoload")); spl_autoload_register(array("Autoload", "d_autoload"));$saler = new Saler();
八、对象克隆
clone
可以克隆对象,通过已有的对象复制一个新的同样的对象,两个对象不是同一个内存地址。
<?php
class Son{public $name;private $money = 0;
}$son = new Son();
$son_clone = clone $son;
- 在对象被克隆时,新对象会自动调用
__clone()
方法。
class Son{public $name;private $money = 0;public function __clone() {var_dump($this);}
}
- 如果不允许在外部克隆对象,将
__clone()
私有化。
相关文章:

PHP面向对象01:面向对象基础
PHP面向对象01:面向对象基础一、关键字说明二、技术实现1. 定义类2. 类成员三、 访问修饰限定符1. public2. protected3. private4. 空修饰限定符四、类内部对象五、构造和析构1. 构造方法2. 析构方法六、范围解析操作符1. 访问类常量2. 静态成员3. self关键字七、类…...

《爆肝整理》保姆级系列教程python接口自动化(十八)--重定向(Location)(详解)
简介 在实际工作中,有些接口请求完以后会重定向到别的url,而你却需要重定向前的url。URL主要是针对虚拟空间而言,因为不是自己独立管理的服务器,所以无法正常进行常规的操作。但是自己又不希望通过主域名的二级目录进行访问&…...
MySQL的索引、视图
什么是索引模式(schema)中的一个数据库对象 在数据库中用来加速对表的查询 通过使用快速路径访问方法快速定位数据,减少了磁盘的I/O 与表独立存放,但不能独立存在,必须属于某个表 由数据库自动维护,表被删除时,该表上的索引自动被…...

【JavaWeb】网络层协议——IP协议
目录 IP协议结构 IP地址管理 特殊IP 解决IP地址不够用 动态分配IP地址 NAT网络地址转换 IPV6 IP协议结构 版本:就是IP协议的版本号。目前只有 4 和 6。这里介绍的是IPV4 首部长度:单位是4字节。于TCP首部长度完全一致,也是可变的&…...
【Python学习笔记】41.Python3 多线程
前言 本章介绍Python的多线程。 Python3 多线程 多线程类似于同时执行多个不同程序,多线程运行有如下优点: 使用线程可以把占据长时间的程序中的任务放到后台去处理。用户界面可以更加吸引人,比如用户点击了一个按钮去触发某些事件的处理…...

Windows 版本ffmpeg编译概述
在使用ffmpeg过程当中,ffmpeg在Linux(包括mac,android)编译非常容易,直接configure,make即可,Android需要交叉编译,在windows就比较麻烦,庆幸的是ffmpeg官方提供已编译好Windows版本的二进制库(http://ffmpeg.org/download.html#b…...

NETCore下CI/CD之自动化测试 (详解篇)
NETCore下CI/CD之自动化测试 (详解篇) 目录:导读 前言 安装JDK 安装 Tomcat 首先,我们需要指定 Tomcat.PID 进程文件,进入 /usr/local/tomcat/bin,编辑文件 增加 tomcat 账户并赋予权限 防止Jeknins…...
Hoeffding不等式剪枝方法
在基于物品的协通过滤算法中,当用户历史行为数据有很多时,对计算会有很大挑战,对此可以使用剪枝对数据进行化简来达到减少计算量。 不是每个物品对都需要进行增量计算。对于两个物品的相似度,每次更新都能够得到一个新的相…...
【算法】数组中的重复数字问题
数组中的重复数据 数组中重复的数字 错误的集合 以第三题,错误的集合为例 对于这样的问题,有很简单的解决方式,先遍历一次数组,用一个哈希表记录每个数字出现的次数,然后遍历一次 [1…N],看看那个元素重…...

数值方法笔记2:解决非线性方程
1. 不动点定理及其条件验证2. 收敛阶、收敛检测与收敛加速2.1 如何估计不动点迭代的收敛阶xk1g(xk){x}_{{k}1}{g}\left({x}_{{k}}\right)xk1g(xk)2.2 给定精度的情况下,如何预测不动点迭代需要迭代的次数2.3 如何加快收敛的速度2.4 停止不定点迭代的条件2.5 不动…...

基于SpringBoot的在线文档管理系统
文末获取源码 开发语言:Java 框架:springboot JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7/8.0 数据库工具:Navicat11 开发软件:eclipse/myeclipse/idea Maven包:Maven3.3.9 浏…...

软件体系结构(期末复习)
文章目录软件体系结构软件体系结构概论软件体系结构建模软件体系结构风格统一建模语言基于体系结构的软件开发软件体系结构 软件体系结构概论 软件危机是指计算机软件的开发和维护过程中遇到的一系列严重问题。 软件危机的表现: 软件危机的原因: 软件工程的基本要素…...

[vue3] pinia的基本使用
使用Pinia npm install piniastore文件里index.js import { createPinia } from piniaconst pinia createPinia()export default piniamain.js导入并引用 import { createApp } from vue import App from ./App.vue import pinia from ./storescreateApp(App).use(pinia).m…...
进程和线程详解
在计算机领域中,进程和线程是非常重要的概念。了解进程和线程是软件开发的基础,也是计算机科学教育中的一部分。本文将介绍进程和线程的概念、区别和应用。 一、什么是进程 在计算机科学中,进程是正在执行的程序实例。一个进程可以由一个或…...
《刀锋》读书笔记
刀锋(毛姆长篇作品精选)毛姆50个笔记点评认为好看的确是完美的结局。《刀锋》里面的人每个人都以自己的方式生活着。艾略特的势利,拉里的自由,伊莎贝尔的现实,苏珊的清醒,索菲的堕落,至于“我”…...
nginx中的ngx_modules
ngx_modules和ngx_module_names是configure脚本生成的,是在objs/ngx_modules.c文件中与其生成的相关的脚本文件相关的变量在options脚本中定义了objs目录的变量NGX_OBJSobjs在init脚本中定义的最终存放ngx_modules的文件 NGX_MODULES_C$NGX_OBJS/ngx_modules.c2. 处…...

设计模式之访问者模式
什么是访问者模式 访问者模式提供了一个作用于某对象结构中的各元素的操作表示,他使我们可以在不改变各元素的类的前提下定义作用于这些元素的新操作。 访问者模式主要包含以下几个角色: Vistor(抽象访问者):为对象结…...

Go项目(三)
文章目录用户微服务表结构查表web 服务跨域问题图形验证码短信用户注册服务中心注册 grpc 服务动态获取端口负载均衡配置中心启动项目小结用户微服务 作为系统的第一个微服务,开发的技术点前面已经了解了一遍,虽有待补充,但急需实战这里主要…...

CTK学习:(一)编译CTK
CTK插件框架简介 CTK Plugin Framework是用于C++的动态组件系统,以OSGi规范为模型。在此框架下,应用程序由不同的组件组成,遵循面向服务的方法。 ctk是一个开源项目,Github 地址:https://github.com/commontk。 源码地址commontk/CTK: A set of common support code for…...

15种NLP数据增强方法总结与对比
数据增强的方法 数据增强(Data Augmentation,简称DA),是指根据现有数据,合成新数据的一类方法。毕竟数据才是真正的效果天花板,有了更多数据后可以提升效果、增强模型泛化能力、提高鲁棒性等。然而由于NLP…...
Linux链表操作全解析
Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表?1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...
SciencePlots——绘制论文中的图片
文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了:一行…...

练习(含atoi的模拟实现,自定义类型等练习)
一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...
Qt Widget类解析与代码注释
#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码,写上注释 当然可以!这段代码是 Qt …...
FastAPI 教程:从入门到实践
FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,支持 Python 3.6。它基于标准 Python 类型提示,易于学习且功能强大。以下是一个完整的 FastAPI 入门教程,涵盖从环境搭建到创建并运行一个简单的…...

Opencv中的addweighted函数
一.addweighted函数作用 addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值&#x…...

如何在最短时间内提升打ctf(web)的水平?
刚刚刷完2遍 bugku 的 web 题,前来答题。 每个人对刷题理解是不同,有的人是看了writeup就等于刷了,有的人是收藏了writeup就等于刷了,有的人是跟着writeup做了一遍就等于刷了,还有的人是独立思考做了一遍就等于刷了。…...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...

项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)
Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败,具体原因是客户端发送了密码认证请求,但Redis服务器未设置密码 1.为Redis设置密码(匹配客户端配置) 步骤: 1).修…...

Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...