PHP基础知识 - PHP面向对象OOP

news2024/12/25 8:53:37

目录

一. 面向对象基本知识

1.1 面向对象概念

1.2 什么是类

1.3 什么是对象

1.4 类与对象的关系

1.5 PHP创建类的示例

二、类、属性、方法的修饰符

2.1 类的修饰符

2.2 成员方法的修饰符

2.3 成员属性修饰符

2.4 访问控制修饰符 

2.5 static 静态修饰符

2.6 final 修饰符

2.7 abstract 抽象修饰符

2.8 interface 接口修饰符

三. 面向对象三大特性

3.1 封装

3.2 继承

3.3 多态 

四. 面向对象七大原则 

4.1 单一职责原则

4.2 开放封闭原则

4.3 里式替换原则

4.4 依赖倒置原则

4.5 接口隔离原则

4.6 迪米特原则

4.7 合成/聚合复用原则


一. 面向对象基本知识

1.1 面向对象概念

点击查看“某”度“某”科的解释

面向对象程序设计(一种计算机编程架构)_百度百科

1.2 什么是类

类是事物相关属性特征和行为特征的集合。

  •     属性特征: 就是该事物的状态。比如: 用户性别、用户的身高。
  •     行为特征: 就是该事物能够做什么。比如: 用户下单、用户评论。

⚠️ 注意

  •         属性特征在类中被称为: 成员属性或成员变量
  •         行为特征在类中被称为: 成员方法

1.3 什么是对象

对象是客户存在的一个实例,是事物的具体实现。可以通过对象调用类的属性行为。 

1.4 类与对象的关系

  • 类是对对象抽象的一个描述
  • 对象是客观存在的一个实体

1.5 PHP创建类的示例

<?php
    # 类: 创建名为 Car 的类
    public class Car
	{
    	# 成员属性
    	public $default_config;
    	static $default_name;
    
    	# 成员方法
    	public function get_config()
        {
            // 需要完成的功能
        }
    	static function get_name()
        {
            // 需要完成的功能
        }
	}

	# 对象: $car_obj 就是 Car 类的一个实例
	# 对象 = new 类名();
	$car_obj = new Car();


	# static 静态修饰符访问示例
        # 格式: 类名::属性名 , 示例: 
        $default_name = Car::default_name;

        # 格式: 类名::方法名 , 示例: 
        $name = Car::get_name(); 

        # 格式: $对象名->静态属性名 , 示例:
        $default_name = $car_obj->default_name;

        # 格式: $对象名->静态方法名 , 示例:
        $name =$car_obj->get_name();

二、类、属性、方法的修饰符

2.1 类的修饰符

类的修饰符有: abstract、final、interface、trait 

2.2 成员方法的修饰符

成员方法的修饰符有: public、protected、private、static、abstract、final 

2.3 成员属性修饰符

属性修饰符有: public、protected、private、static、var

 

var 与 public 作用相同, var 是 public 的别名。

2.4 访问控制修饰符 

 

2.5 static 静态修饰符

示例请看上边的代码

    static 静态修饰符 : 用于修饰类的成员属性和成员方法 。

    static 关键字 : 修饰的成员方法称为静态方法,修饰的成员属性称为静态属性。


调用方法:

        可以不用 new(实例化)就可以直接调用, 格式 类名::属性名
        静态方法在实例化后的对象也可以访问, 格式 对象名->属性名


⚠️注意:

        在静态方法中不可以使用非静态的内容。就是不让使用 $this
        在类的方法中可以使用其他静态属性和静态方法,不过要使用self关键字,如 self::静态属性名 或 self::静态方法名

2.6 final 修饰符

类使用时: 如果使用 final关键字修饰时 ,表示这个类不可以有子类,即不能被 继承

 

成员方法使用时: 如果成员方法 使用 final 关键字修饰时,表示这个成员方法不可以在子类中被覆盖,即不能被 重写

2.7 abstract 抽象修饰符

类使用时:

<?php
abstract class ClassName{
    public function functionName();
}
  1. 抽象类中的成员方法没有方法体,以 (); 结束。
  2. 该类不能被实例化
  3. 若想使用抽象类,就必须定义一个类去继承这个抽象类,并定义覆盖父类的抽象方法(实现抽象方法)。

 成员方法使用时:

<?php
	abstract class ClassName{
		abstract function functionName();
	}
  1. 称为抽象方法,使用关键字 abstract 定义
  2. 包含抽象方法的类必须是抽象类,类也要使用关键字abstract加以声明。

⚠️注意 : 含有抽象方法的类肯定是抽象类,但是不是所有的抽象类都必须包含抽象方法。 

2.8 interface 接口修饰符

假如一个抽象类中所有的方法都是抽象的,那么我们可以使用另外一种方式定义:接口。 

接口使用关键字interface来定义,接口中只能有常量抽象方法

<?php
	# 接口定义格式:
	interface interfaceName{
		# 常量定义
		const USERLEVEL = 'TOP';

		# 抽象方法定义, 注意抽象方法不需要有 abstract 关键字, 且以 (); 结尾
		function funName();
	}

 

<?php
	# 接口实现, 定义一个类, 使用 implements 关键字实现
	class 类名 implements 接口名1, 接口名2
	{
		# 必须将 接口 中的所有方法全部重写实现
	}

三. 面向对象三大特性

三大特性: 封装、继承、多态。 

3.1 封装

我理解的 封装 就是 类的定义, 将事物相关属性特征行为特征的集合在一起,形成一个 ,这就是封装。 

3.2 继承

继承 顾名思义就是 B类 继承 A类,继承后, B类 就可以调用访问 A类 非私有的成员属性与成员方法。通过继承创建的类被称为 “子类” 或 “派生类”。被继承的类称为 “基类” 或 “父类”

⚠️ PHP 通过 extends 关键字继承,且一个类只能继承一个父类。

<?php

    # 父类
    class A{

	}

	# 子类
	class B extends A{

    }

3.3 多态 

我理解的多态就是: 同一个方法,传入不同的对象,实现不同的效果。

<?php

# 注意: 该部分代码没有实际运行, 不保证运行结果可以成功。
# 但是这个逻辑。

	class BuyCar{
		function buyFunc($obj){
         if ($obj instanceof Car){
             $obj->buy();
         } else {
             echo 'No Buy';
         }
     }
	}

	/**
	 * 定义 Car 接口
	 */
	interface Car{
        function buy();
    }

	/**
	 * 定义奔驰类
	 */
	class Benz implements Car{
        function buy(){
            echo 'Benz buy';
        }
    }

	/**
	 * 定义宝马类
	 */
	class Bmw implements Car{
        function buy(){
            echo 'Bmw buy';
        }
    }

	# 实例化 BuyCar 类
	$BuyCar_obj = new BuyCar();

	# 调用 buyFunc
	$BuyCar_obj->buyFunc(new Benz());

	$BuyCar_obj->buyFunc(new Bmw());

四. 面向对象七大原则 

  1. 单一职责原则、
  2. 开放封闭原则、
  3. 里式替换原则、
  4. 依赖倒置原则、
  5. 接口隔离原则、
  6. 迪米特原则、
  7. 合成/聚合复用原则 

4.1 单一职责原则

单一职责原则(Single Responsibility Principle,SRP): 一个类应仅有一个职责。

 

通俗的讲就是一个类当中的所有成员方法完成的工作相关性是相同的。

 

例: 一个类不能即完成用户的注册, 又完成商品的购买。

4.2 开放封闭原则

开放封装原则(Open-Closed Principle,OCP): 即对扩展开放对修改关闭。

 

通俗的讲就是 在不修改源代码的情况下,对其扩展,不影响原有功能。

4.3 里式替换原则

里式替换原则(Liskov Substitution Principle ,LSP): 所有引用基类的地方必须能透明地使用其子类的对象。

 

通俗的讲就是 子类可扩展父类, 而不是覆盖父类或改变父类原有的功能。

4.4 依赖倒置原则

依赖倒置原则(Dependency Inversion Principle ,DIP): 依赖于抽象。

 

通俗的讲:

  1. 高层次模块不应该依赖于低层次模块,两者都应依赖于抽象
  2. 抽象不应该依赖细节,细节应该依赖于抽象。

4.5 接口隔离原则

接口隔离原则(Interface Segregation Principle, ISP): 使用多个小且专门的接口, 不要使用一个大的总接口。

 

通俗的讲就是: 不要把所有功能都写在一个接口中,干啥的就是干啥的,且不应该依赖那些不需要用不着的接口。

4.6 迪米特原则

迪米特原则(Law of Demeter ,LoD): 降低类与类之间的耦合。

 

通俗的讲就是: 没有关系的类别硬往一起扯,减少没用的交际。

4.7 合成/聚合复用原则

合成/聚合复用原则(Composite/Aggregate Reuse Principle ,CARP): 尽量使用对象组合,而不是继承来达到复用的目的。

 

通俗的讲就是: PHP类之间的关系,尽可能的多使用 traituse ,少使用 extends

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

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

相关文章

多模块项目中,SpringBoot项目下启动失败-无法加载主类com.xch.XxxApplication

错误&#xff1a;项目启动时&#xff0c;无法找到主类(启动类)XxxApplication由于&#xff0c;主类需要先被编译&#xff0c;再被JVM找到编译后的文件运行如&#xff1a;XxxApplication.java-(编译)-XxxApplication.class-(运行)所以&#xff0c;原因&#xff1a;1、未编译情况…

基于微信小程序的校运会管理系统

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端框架&#xff1a;VUE 数据库&#xff1a;MySQL5.7以上 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录 一、项目简介…

Erlik 2:一个基于Flask开发的包含大量安全漏洞的研究平台

关于Erlik 2 Erlik 2&#xff0c;也被称为Vulnerable-Flask- App&#xff0c;该工具是一个基于Flask开发的包含大量安全漏洞的研究平台。本质上来说&#xff0c;它是一个包含了大量漏洞的Flask Web应用程序。有了这个实验环境&#xff0c;广大研究人员可以轻松在Web渗透测试领…

【算法题解】14. 有效的括号

文章目录题目解法&#xff1a;使用栈的特性Java 代码实现Go 代码实现复杂度分析这是一道 简单 题。 来自&#xff1a;leetcode 题目 给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串 s &#xff0c;判断字符串是否有效。 有效字…

哈工大操作系统学习笔记(二)进程与线程

文章目录CPU管理的直观想法多进程图像用户级线程内核级线程内核级线程实现操作系统之树CPU 调度策略一个实际的schedule 函数进程同步与信号量信号量临界区保护信号量的代码实现死锁处理CPU管理的直观想法 CPU的工作原理&#xff1a; 自动的取值执行&#xff0c;给了初始地址&…

Swift 周报 第二十一期

前言 本期是 Swift 编辑组自主整理周报的第十二期&#xff0c;每个模块已初步成型。各位读者如果有好的提议&#xff0c;欢迎在文末留言。 Swift 周报在 GitHub 开源&#xff0c;欢迎提交 issue&#xff0c;投稿或推荐内容。目前计划每两周周一发布&#xff0c;欢迎志同道合的…

永久删除的照片怎么找回来?教你三招恢复方法

如果文件被永久删除了&#xff0c;想要恢复就没有这么简单了&#xff0c;永久删除的文件可能是已经从回收站清空的文件&#xff0c;或者是我们按住快捷键“shiftdelete”快捷键删除的文件&#xff0c;这样的话&#xff0c;我们无法在电脑上面查找到文件&#xff0c;潜意识里面认…

SAP ABAP SY-REPID 变化「Note」

6.10 前&#xff08;知悉&#xff09; SY-CPROG The name of the calling program in an external routine, otherwise the name of the current program. 外部例程中调用程序的名称&#xff0c;否则为当前程序的名称 SY-REPID Name of the current ABAP program. For externa…

第一章-操作系统引论

&#x1f31e;欢迎来到操作系统的世界 &#x1f308;博客主页&#xff1a;卿云阁 &#x1f48c;欢迎关注&#x1f389;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f31f;本文由卿云阁原创&#xff01; &#x1f64f;作者水平很有限&#xff0c;如果发现错误&#xff…

解决数据兼容性问题

数据兼容性问题解决 问题说明 最近经常遇到新老数据兼容性的问题&#xff1a;某些新同事更改代码后&#xff0c;没有兼容旧数据&#xff0c;已有用户的数据显示不全或者错误&#xff0c;很麻烦。 技术层面&#xff0c;就是某个数据或者字段&#xff0c;存储在服务器上&#…

java后端工程师面试题(笔试):2022-11-04 经历(一)

java后端工程师面试题&#xff08;笔试&#xff09;&#xff1a;2022-11-04&#xff1a; 面试题&#xff1a;总分100 1、关于盒子模型(5分) 1&#xff09;盒子模型的种类有几种?分别是什么?(1分) 2种&#xff0c;分别是1、W3C标准盒子模型 2、IE盒子模型2) 容器中使用di…

射频已调波同步广播技术在山区高速公路同步广播建设中的应用

北京恒星科通发布于2023-2-2 我国高速公路建设速度的加快&#xff0c;目前我国已经建成通车的高速公路总里程已经达到14万公里&#xff0c;高速公路的安全与信息化建也达到了快速发展&#xff0c;高速公路调频广播覆盖一直是困扰高速公路管理方的一个重要问题&#xff0c;我国…

实时分析全面赋能金融业务,马上消费基于 Apache Doris 构建实时数仓的实践

导读&#xff1a; 近年来&#xff0c;马上消费的业务体量呈飞跃式增长&#xff0c;每天产生数据可达上千亿条&#xff0c;如何更高效挖掘这些数据的价值&#xff0c;成为了其必须要面临的挑战。随着各业务对实时数据分析的需求越来越强烈&#xff0c;马上消费于 2021 年引入 Ap…

点云处理指南介绍

目录 一、点云处理介绍&#xff1a; 二、Open3D文章目录&#xff1a; Open3D几何部分&#xff08;Geometry&#xff09; 点云处理&#xff08;点云IO/可视化/数据结构/下采样/凸包计算/裁减/法向量估计/聚类/隐藏点移除/平面分割/最小外接矩形/外点移除&#xff09; 面片&…

HTML5+CSS3(三)-全面详解(学习总结---从入门到深化)

目录 Form表单 表单元素 学习效果反馈 表单元素一 文本框 密码框 单选按钮 学习效果反馈 表单元素二 复选框 文件 提交按钮 重置按钮 学习效果反馈 表单元素三 下拉列表 多行文本框 label 学习效果反馈 HTML5新增type类型一 url search tel color 学习效果反馈 HTML5新增…

「Python|网页开发」如何使用Django快速开始进行网页开发:写个Hello World!

本文主要介绍如何从零开始借助django框架快速启动一个网页服务器然后进入编写HTML页面的阶段。 文章目录安装django创建并启动网页项目在网页项目中创建一个应用创建页面并设置好对应关系安装django Django是Python的一个第三方库&#xff0c;里面已经将编写网页需要的代码结构…

如何更改报表控件 Stimulsoft BI 服务器中的地址和端口?

在本文中&#xff0c;我们将主要讨论如何在 Stimulsoft BI Server 中设置基本参数&#xff0c;具体来说&#xff0c;也就是如何更改服务器的地址和端口&#xff1f; 为什么需要更改服务器地址和端口&#xff1f; 在部署报表服务器时&#xff0c;需要指定其地址&#xff0c;实…

使用Websockets和Vert.x进行实时竞价

翻译: 白石(https://github.com/wjw465150/Vert.x-Core-Manual) 原文地址: https://vertx.io/blog/real-time-bidding-with-websockets-and-vert-x/ 在过去的几年中&#xff0c;用户对网络应用程序的期望发生了变化。在拍卖竞价过程中&#xff0c;用户不再需要按下刷新按钮来检…

【C++】STL — map和set的介绍 + 使用

文章目录&#x1f4d6; 前言1. 键值对的引入⚡2. 树形结构的关联式容器&#x1f31f;3. set的介绍 使用⭐4. map的介绍 使用⭐&#x1f3c1;4.4.1 利用map统计次数&#xff1a;&#x1f3c1;4.4.2 std::map::operator[]&#x1f4d6; 前言 本章将继续学习STL中的两个很重要的…

23.2.2打卡 2023牛客寒假算法基础集训营5 ABCDHKL 最详细的一集

A 这题据说可以贪心写 我为了省事直接upper二分第一个大于x的商品然后向前遍历完事 /* ⣿⣿⣿⣿⣿⣿⡷⣯⢿⣿⣷⣻⢯⣿⡽⣻⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣇⠸⣿⣿⣆⠹⣿⣿⢾⣟⣯⣿⣿⣿⣿⣿⣿⣽⣻⣿⣿⣿⣿⣿⣿⣿ ⣿⣿⣿⣿⣿⣿⣻⣽⡿⣿⣎⠙⣿⣞⣷⡌⢻⣟⣿⣿⣿⣿⣿⣿⣿…