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

PHP面向对象01:面向对象基础

PHP面向对象01:面向对象基础

  • 一、关键字说明
  • 二、技术实现
    • 1. 定义类
    • 2. 类成员
  • 三、 访问修饰限定符
    • 1. public
    • 2. protected
    • 3. private
    • 4. 空修饰限定符
  • 四、类内部对象
  • 五、构造和析构
    • 1. 构造方法
    • 2. 析构方法
  • 六、范围解析操作符
    • 1. 访问类常量
    • 2. 静态成员
    • 3. self关键字
  • 七、类的加载
    • 1. 手动加载
    • 2. 自动加载
  • 八、对象克隆

一、关键字说明

  1. class:类。
  2. object:对象,也称实例。
  3. new:实例化。
  4. member:类成员。
  5. method:方法,也称成员方法。
  6. property:属性,也称成员变量。
  7. constant:类常量。

二、技术实现

1. 定义类

  • 定义类基本语法:class 类名 {}
<?php
# 定义类
class Nothing {}
# 实例化对象
$nothing = new Nothing;var_dump($nothing);

在这里插入图片描述
数据类型为对象,对象属于Nothing类,编号为1,当前对象里面有0个属性。

2. 类成员

  • 指直接定义在类结构内部的以及成员,即直接依赖{}的成员。
  • 分为三种:成员变量、成员方法、类常量。
  1. 成员变量:

    • 需要在变量名字前使用关键字 public。
    • 语法:public 变量名 [=值];
    class Nothing {public $a;public $b = 1;
    }
    
    • 访问方式:$对象名->属性名;
    # 实例化对象
    $nothing = new Nothing;# 增
    $nothing->c = 20;
    # 删
    unset($nothing->a);
    # 改
    $nothing->b = -1;
    # 查
    echo $nothing->b;
    
  2. 成员方法:

    • 在类结构{}下定义的函数。
    class Salar {public function display() {echo __CLASS__;}
    }
    
    • 成员方法访问:$对象名->方法名();
    $s = new Salar();
    $s->display();
    
  3. 类常量:

    • 定义方式: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在对象被销毁时会自动调用。
  • 使用析构方法的情况:
    1. 保存对象的变量被用来保存其他数据,导致对象内存没有任何变量引用。
    2. 删除对象变量。
    3. 脚本执行结束,释放所有变量。
<?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&#xff1a;面向对象基础一、关键字说明二、技术实现1. 定义类2. 类成员三、 访问修饰限定符1. public2. protected3. private4. 空修饰限定符四、类内部对象五、构造和析构1. 构造方法2. 析构方法六、范围解析操作符1. 访问类常量2. 静态成员3. self关键字七、类…...

《爆肝整理》保姆级系列教程python接口自动化(十八)--重定向(Location)(详解)

简介   在实际工作中&#xff0c;有些接口请求完以后会重定向到别的url&#xff0c;而你却需要重定向前的url。URL主要是针对虚拟空间而言&#xff0c;因为不是自己独立管理的服务器&#xff0c;所以无法正常进行常规的操作。但是自己又不希望通过主域名的二级目录进行访问&…...

MySQL的索引、视图

什么是索引模式(schema)中的一个数据库对象 在数据库中用来加速对表的查询 通过使用快速路径访问方法快速定位数据,减少了磁盘的I/O 与表独立存放&#xff0c;但不能独立存在&#xff0c;必须属于某个表 由数据库自动维护&#xff0c;表被删除时&#xff0c;该表上的索引自动被…...

【JavaWeb】网络层协议——IP协议

目录 IP协议结构 IP地址管理 特殊IP 解决IP地址不够用 动态分配IP地址 NAT网络地址转换 IPV6 IP协议结构 版本&#xff1a;就是IP协议的版本号。目前只有 4 和 6。这里介绍的是IPV4 首部长度&#xff1a;单位是4字节。于TCP首部长度完全一致&#xff0c;也是可变的&…...

【Python学习笔记】41.Python3 多线程

前言 本章介绍Python的多线程。 Python3 多线程 多线程类似于同时执行多个不同程序&#xff0c;多线程运行有如下优点&#xff1a; 使用线程可以把占据长时间的程序中的任务放到后台去处理。用户界面可以更加吸引人&#xff0c;比如用户点击了一个按钮去触发某些事件的处理…...

Windows 版本ffmpeg编译概述

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

NETCore下CI/CD之自动化测试 (详解篇)

NETCore下CI/CD之自动化测试 &#xff08;详解篇&#xff09; 目录&#xff1a;导读 前言 安装JDK 安装 Tomcat 首先&#xff0c;我们需要指定 Tomcat.PID 进程文件&#xff0c;进入 /usr/local/tomcat/bin&#xff0c;编辑文件 增加 tomcat 账户并赋予权限 防止Jeknins…...

Hoeffding不等式剪枝方法

在基于物品的协通过滤算法中&#xff0c;当用户历史行为数据有很多时&#xff0c;对计算会有很大挑战&#xff0c;对此可以使用剪枝对数据进行化简来达到减少计算量。     不是每个物品对都需要进行增量计算。对于两个物品的相似度&#xff0c;每次更新都能够得到一个新的相…...

【算法】数组中的重复数字问题

数组中的重复数据 数组中重复的数字 错误的集合 以第三题&#xff0c;错误的集合为例 对于这样的问题&#xff0c;有很简单的解决方式&#xff0c;先遍历一次数组&#xff0c;用一个哈希表记录每个数字出现的次数&#xff0c;然后遍历一次 [1…N]&#xff0c;看看那个元素重…...

数值方法笔记2:解决非线性方程

1. 不动点定理及其条件验证2. 收敛阶、收敛检测与收敛加速2.1 如何估计不动点迭代的收敛阶xk1g(xk){x}_{{k}1}{g}\left({x}_{{k}}\right)xk1​g(xk​)2.2 给定精度的情况下&#xff0c;如何预测不动点迭代需要迭代的次数2.3 如何加快收敛的速度2.4 停止不定点迭代的条件2.5 不动…...

基于SpringBoot的在线文档管理系统

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7/8.0 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.3.9 浏…...

软件体系结构(期末复习)

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

[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…...

进程和线程详解

在计算机领域中&#xff0c;进程和线程是非常重要的概念。了解进程和线程是软件开发的基础&#xff0c;也是计算机科学教育中的一部分。本文将介绍进程和线程的概念、区别和应用。 一、什么是进程 在计算机科学中&#xff0c;进程是正在执行的程序实例。一个进程可以由一个或…...

《刀锋》读书笔记

刀锋&#xff08;毛姆长篇作品精选&#xff09;毛姆50个笔记点评认为好看的确是完美的结局。《刀锋》里面的人每个人都以自己的方式生活着。艾略特的势利&#xff0c;拉里的自由&#xff0c;伊莎贝尔的现实&#xff0c;苏珊的清醒&#xff0c;索菲的堕落&#xff0c;至于“我”…...

nginx中的ngx_modules

ngx_modules和ngx_module_names是configure脚本生成的&#xff0c;是在objs/ngx_modules.c文件中与其生成的相关的脚本文件相关的变量在options脚本中定义了objs目录的变量NGX_OBJSobjs在init脚本中定义的最终存放ngx_modules的文件 NGX_MODULES_C$NGX_OBJS/ngx_modules.c2. 处…...

设计模式之访问者模式

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

Go项目(三)

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

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数据增强方法总结与对比

数据增强的方法 数据增强&#xff08;Data Augmentation&#xff0c;简称DA&#xff09;&#xff0c;是指根据现有数据&#xff0c;合成新数据的一类方法。毕竟数据才是真正的效果天花板&#xff0c;有了更多数据后可以提升效果、增强模型泛化能力、提高鲁棒性等。然而由于NLP…...

手游刚开服就被攻击怎么办?如何防御DDoS?

开服初期是手游最脆弱的阶段&#xff0c;极易成为DDoS攻击的目标。一旦遭遇攻击&#xff0c;可能导致服务器瘫痪、玩家流失&#xff0c;甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案&#xff0c;帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...

基于FPGA的PID算法学习———实现PID比例控制算法

基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容&#xff1a;参考网站&#xff1a; PID算法控制 PID即&#xff1a;Proportional&#xff08;比例&#xff09;、Integral&#xff08;积分&…...

大型活动交通拥堵治理的视觉算法应用

大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动&#xff08;如演唱会、马拉松赛事、高考中考等&#xff09;期间&#xff0c;城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例&#xff0c;暖城商圈曾因观众集中离场导致周边…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容

基于 ​UniApp + WebSocket​实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配​微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序

一、开发环境准备 ​​工具安装​​&#xff1a; 下载安装DevEco Studio 4.0&#xff08;支持HarmonyOS 5&#xff09;配置HarmonyOS SDK 5.0确保Node.js版本≥14 ​​项目初始化​​&#xff1a; ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)

设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile&#xff0c;新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)

一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解&#xff0c;适合用作学习或写简历项目背景说明。 &#x1f9e0; 一、概念简介&#xff1a;Solidity 合约开发 Solidity 是一种专门为 以太坊&#xff08;Ethereum&#xff09;平台编写智能合约的高级编…...

AspectJ 在 Android 中的完整使用指南

一、环境配置&#xff08;Gradle 7.0 适配&#xff09; 1. 项目级 build.gradle // 注意&#xff1a;沪江插件已停更&#xff0c;推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题

在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件&#xff0c;这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下&#xff0c;实现高效测试与快速迭代&#xff1f;这一命题正考验着…...

深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用

文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么&#xff1f;1.1.2 感知机的工作原理 1.2 感知机的简单应用&#xff1a;基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...