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

news2024/9/23 1:18:53

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()私有化。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/357215.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

自动驾驶:时钟同步

文章目录 一、自动驾驶时间同步简介二、时间同步需要的服务1、PTP1.1 ptp4l三、UTC转换UNIX时间戳(timestamp)一、自动驾驶时间同步简介 二、时间同步需要的服务 1、PTP ptp4l -i mgbe3_0 -f /etc/automotive-slave.cfg & phc2sys -s mgbe3_0 -O 0

IDEA插件 RestfulTool插件——Restful服务开发辅助工具集

IDEA插件 RestfulTool插件——Restful服务开发辅助工具集 目录IDEA插件 RestfulTool插件——Restful服务开发辅助工具集1.插件介绍2.安装方式3.使用方法1.插件介绍 RestfulTool插件。一套 Restful 服务开发辅助工具集&#xff1a; 提供了一个 Services tree 的显示窗口 双击 …

Linux C/C++ 多线程TCP/UDP服务器 (监控系统状态)

Linux环境中实现并发TCP/IP服务器。多线程在解决方案中提供了并发性。由于并发性&#xff0c;它允许多个客户端同时连接到服务器并与服务器交互。 Linux多线程编程概述 许多应用程序同时处理多项杂务。服务器应用程序处理并发客户端&#xff1b;交互式应用程序通常在处理后台…

80211无线网络架构

无线网络架构物理组件BSS&#xff08;Basic Service Set&#xff09;基本服务集BSSID&#xff08;BSS Identification&#xff09;ssid&#xff08;Service Set Identification&#xff09;ESS&#xff08;Extended Service Set&#xff09;扩展服务集物理组件 无线网络包含四…

【C++学习】基础语法(三)

众所周知C语言是面向过程的编程语言&#xff0c;关注的是过程&#xff1b;解决问题前&#xff0c;需要分析求解的步骤&#xff0c;然后编辑函数逐步解决问题。C是基于面向对象的&#xff0c;关注的是对象&#xff0c;将一件事拆分成不同的对象&#xff0c;不同对象间交互解决问…

C++:类与对象

文章目录一.面向过程和面向对象的初步认识二.类1.类的初步认识2.类的定义3.类的访问限定符4.类的作用域5.类的实例化6.类对象模型三.this指针1.什么是this指针2.this指针的特性3.this指针的空指针问题四.浅谈封装五.类的默认成员函数1.构造函数1.1构造函数的概念1.2构造函数的用…

jenkins 安装 -适用于在线安装 后续写个离线安装的

jenkins安装1.下载jenkins2.安装启动3.附件卸载jdk的命令4.配置jenkins一、在jenkins配置文件中配置jdk环境变量二、修改jenkins默认的操作用户1.下载jenkins jenkins官网下载 https://www.jenkins.io/ 点击下载 我是centos系统所以选择centos&#xff0c;点击后按着官方提供…

golang简单实现chatgpt网页聊天

效果如图&#xff1a; 安装openai的sdk&#xff1a; go get github.com/sashabaranov/go-gpt3go代码&#xff1a; main.go package mainimport ("fmt""net/http""os"gogpt "github.com/sashabaranov/go-gpt3" )var client gogpt.N…

高可用 - 02 Keepalived_VRRP工作原理

文章目录Keepalived VS HeartbeatKeepalived的用途VRRP与工作原理物理路由器和虚拟路由器Keepalived VS Heartbeat Keepalived是Linux下一个轻量级的高可用解决方案&#xff0c;它与Heartbeat、RoseHA实现的功能类似&#xff0c;都可以实现服务或者网络的高可用&#xff0c;但…

SmS-Activate一款好用的短信验证码接收工具

前言 有些国外应用在使用应用上的功能时需要注册账号&#xff0c;由于某种不可抗因素&#xff0c;我们的手机号一般不支持注册&#xff0c;接收不到信息验证码&#xff0c;于是我们可以使用SmS-Activate提供的服务&#xff0c;使用$实现我们的需求&#xff08;大概一次验证1-5…

Python练习系统

用python给自己做个练习系统刷题吧&#xff01; #免费源码在文末公众号哈# 选择题 def xuanze():global flag2if flag21:def insert():numvar1.get()questionvar2.get()choicevar3.get()answervar4.get()with open(d:\\练习系统\\练习三3.1.pickle,rb) as file:lst1pickle.lo…

golang入门笔记——内存管理和编译器优化

静态分析 静态分析&#xff1a;不执行程序代码&#xff0c;推导程序的行为&#xff0c;分析程序的性质 控制流&#xff08;control flow&#xff09;&#xff1a;程序的执行流程 数据流&#xff08;data flow&#xff09;&#xff1a;数据在控制流上的传递 通过分析控制流和…

网络安全应急响应服务方案怎么写?包含哪些阶段?一文带你了解!

文章目录一、服务范围及流程1.1 服务范围1.2 服务流程及内容二、准备阶段2.1 负责人准备内容2.2 技术人员准备内容&#xff08;一&#xff09;服务需求界定&#xff08;二&#xff09;主机和网络设备安全初始化快照和备份2.3市场人员准备内容&#xff08;1&#xff09;预防和预…

全网最新的软件测试/自动化测试必问的面试题合集

1.你为什么选择软件测试行业因为之前有了解软件测试这个行业&#xff0c;觉得他的发展前景很好。2.根据你以前的工作经验描述一下软件开发、测试过程&#xff0c;由那些角色负责&#xff0c;你做什么要有架构师、开发经理、测试经理、程序员、测试员。我在里面主要是负责所分到…

曙光超算平台 如何使用 Tensorboard (乌镇中心)

在E-Shell中执行 1. salloc -p 队列名 -N 1 -n 32 --gresdcu:4 salloc -p wzhdtest -N 1 -n 32 --gresdcu:4 2. ssh 节点名 ssh g01r3n07 3. conda deactivate 4. 查看当前所有模块 module ava compiler 从上图中加载某个dtk模块 module load compiler/dtk/21.10 注&…

第九章 vue 进阶篇 Element Plus 基本使用

Element Plus 基本使用 element-ui 是基于vue 开发的一套ui组件库&#xff0c;提供丰富的网页开发组件&#xff0c;可用快速开发网站&#xff0c;降低前端开发成本 版本 element目前有两个版本 element-ui&#xff1a;基于vue2 element-plus: 基于vue3官网地址 https://elem…

JVM知识体系学习七:了解JVM常用命令行参数、GC日志详解、调优三大方面(JVM规划和预调优、优化JVM环境、JVM运行出现的各种问题)

文章目录前言一、了解JVM常用命令行参数1、命令行参数概述2、常用命令3、通过案例学命令行参数(Linux)4、区分概念二、GC日志详解1、打印详细日志2、日志描述3、解析案例三、调优前的基础概念四、调优是什么&#xff1f;1、调优1&#xff1a;JVM规划和预调优a、涨知识时刻b、概…

解決 torch 無法使用GPU

1.使用 import torch torch.cuda.is_available() ------> False print(torch.version) --> 查詢 torch 版本 2.命令行&#xff0c;輸入 nvidia-smi 3.直接去網站找出相對應版本 https://download.pytorch.org/whl/torch_stable.html cuda : 11.7 -> cu117 python3.…

分享95个HTML娱乐休闲模板,总有一款适合您

分享95个HTML娱乐休闲模板&#xff0c;总有一款适合您 95个HTML娱乐休闲模板下载链接&#xff1a;https://pan.baidu.com/s/1nBCV2kTy1csY3z8QRqXrsQ?pwd946p 提取码&#xff1a;946p Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 夜店娱乐网站模板 游戏模板…

mybatis条件构造器(二)

mybatis条件构造器(二) 1 准备工作 1.1 建表sql语句(Emp表) SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS 0;-- ---------------------------- -- Table structure for emp -- ---------------------------- DROP TABLE IF EXISTS emp; CREATE TABLE emp (EMPNO int NOT NU…