PHP 面向对象,构造函数,析构函数,继承,方法的重写,接口抽象类,static,final,this,parent,self的异同和作用

news2025/2/27 1:58:11

PHP 面向对象,构造函数,析构函数,继承,方法的重写,接口抽象类,static,final,this,parent,self的异同和作用

    • PHP 面向对象
      • 1.构造函数
      • 2.析构函数
      • 3.继承
      • 4.方法重写
      • 5.访问控制
      • 6.接口
      • 7.抽象类
      • 8.静态static
      • 9.final
      • 10. this ,self ,parent
        • (1) this
        • (2) self
        • (3) parent

PHP 面向对象

面向对象编程的三个主要特性:

  • 封装(Encapsulation):指将对象的属性和方法封装在一起,使得外部无法直接访问和修改对象的内部状态。通过使用访问控制修饰符(public、private、protected)来限制属性和方法的访问权限,从而实现封装。
  • 继承(Inheritance):指可以创建一个新的类,该类继承了父类的属性和方法,并且可以添加自己的属性和方法。通过继承,可以避免重复编写相似的代码,并且可以实现代码的重用。
  • 多态(Polymorphism):指可以使用一个父类类型的变量来引用不同子类类型的对象,从而实现对不同对象的统一操作。多态可以使得代码更加灵活,具有更好的可扩展性和可维护性。在 PHP 中,多态可以通过实现接口(interface)和使用抽象类(abstract class)来实现。

1.构造函数

构造函数(construct)是一种特殊的方法。主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,在创建对象的语句中与 new 运算符一起使用。

<?php
class Cat{

    // 成员变量
    public $name;
    public $age;


    // 构造函数
    public function __construct($name, $age)
    {
        $this->name = $name;
        $this->age = $age;
    }

    // 成员方法
    public function details(){
        echo '姓名:'.$this->name.'年龄:'.$this->age;
    }
}

$animal = new Cat('小白',10);
$animal->details(); // 姓名:小白年龄:10
echo "<hr>";

注意:php不像java那样,可以提供多个构造器,只能提供一个构造器,若提供了有参构造函数,则必须在new时传入相应的初始化参数。

2.析构函数

析构函数(destructor) 与构造函数相反,当对象结束其生命周期时(例如对象所在的函数已调用完毕),系统自动执行析构函数。

<?php
class Plane{
    public function __destruct()
    {
       echo '析构方法,对象结束生命周期时执行或者当前php脚本执行完毕时执行';
    }
}

$p = new Plane();
echo '~~~~天气晴'.'<br>';

在这里插入图片描述

3.继承

PHP 使用关键字 extends 来继承一个类,PHP 不支持多继承,且使用final修饰的类无法再被继承。

<?php

final class Person{
    
    public $name = '人类';
}

// 报错,提示final修饰的类无法被继承
class Student extends  Person{
    
}

4.方法重写

如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。

<?php

class Person{

    public $name = '人类';
    public function  showInfo(){
        echo '我的名字是'.$this->name.'<br>';
    }
}

class Student extends  Person{
    public $name = '学生';
    public $cid = '小学一年级';
    public function showInfo()
    {
        parent::showInfo();
        echo '我的年级是:'.$this->cid;
    }

}

$st1 = new Student();
$st1->showInfo();
// 我的名字是学生
// 我的年级是:小学一年级

$this,指向当前实例对象的内容。

parent::showInfo() 或者 parent::xxxx(),代表当前的子类调用从父类继承的方法,和Java中的super.()类似.

5.访问控制

PHP 对属性或方法的访问控制,是通过在前面添加关键字 public(公有),protected(受保护)或 private(私有)来实现的。

  • public(公有):公有的类成员可以在任何地方被访问。
  • protected(受保护):受保护的类成员则可以被其自身以及其子类和父类访问。
  • private(私有):私有的类成员则只能被其定义所在的类访问。

6.接口

使用接口(interface),可以指定某个类必须实现哪些方法,但不需要定义这些方法的具体内容。

接口是通过 interface 关键字来定义的,就像定义一个标准的类一样,但其中定义所有的方法都是空的。

接口中定义的所有方法都必须是公有,这是接口的特性。

要实现一个接口,使用 implements 操作符。类中必须实现接口中定义的所有方法,否则会报一个致命错误。类可以实现多个接口,用逗号来分隔多个接口的名称。

<?php

interface ComInterface{
    public function connect();
    public function transfer();
    public function disconnect();
}

class MobilePhone implements ComInterface{

    public function connect()
    {
        echo '连接开始'.'<br>';
    }

    public function transfer()
    {
        echo '连接传输'.'<br>';
    }

    public function disconnect()
    {
        echo '连接关闭'.'<br>';
    }
}

$phone1 = new MobilePhone();
$phone1->connect();
$phone1->transfer();
$phone1->disconnect();

//连接开始
//连接传输
//连接关闭
<?php

interface behavior{

    public function say();

    public function jump();
}

interface behavior2{
    public function eat();
}

class Superman implements behavior,behavior2 {

    public function say()
    {
        echo '超人说:我在执行任务'.'<br>';
    }

    public function jump()
    {
        echo '超人,嗖的一下跳了出去!'.'<br>';
    }

    public function eat()
    {
        echo '超人:我不需要吃东西'.'<br>';
    }
}

class Duck implements behavior,behavior2 {

    public function say()
    {
        echo '鸭子:嘎嘎嘎'.'<br>';
    }

    public function jump()
    {
        echo '鸭子:左右摇摆的跳进了水里'.'<br>';
    }

    public function eat()
    {
        echo '鸭子吃食物'.'<br>';
    }
}


$sp  =  new Superman();
$sp->say();
$sp->jump();
$sp->eat();

echo '<hr>';

$dk  =  new Duck();
$dk->say();
$dk->jump();
$dk->eat();

在这里插入图片描述

7.抽象类

任何一个类,如果它里面至少有一个方法是被声明为抽象的,那么这个类就必须被声明为抽象(abstract)的。

定义为抽象的类不能被实例化。

被定义为抽象的方法只是声明了其调用方式(参数),不能定义其具体的功能实现。

继承一个抽象类的时候,子类必须定义父类中的所有抽象方法;另外,这些方法的访问控制必须和父类中一样(或者更为宽松)。例如某个抽象方法被声明为受保护的,那么子类中实现的方法就应该声明为受保护的或者公有的,而不能定义为私有的。

<?php
abstract class sport{
    public abstract function status();
}

class Run extends sport{

    public function status()
    {
        echo 'Run Run Run';
    }
}

$runners = new Run();
$runners->status();// Run Run Run

8.静态static

声明类属性或方法为 static(静态),就可以不实例化类而直接访问。

静态属性不能通过一个类已实例化的对象来访问(但静态方法可以)。

由于静态方法不需要通过对象即可调用,所以伪变量 $this 在静态方法中不可用。

静态属性不可以由对象通过 -> 操作符来访问。

<?php
class Superman{

    // 静态变量,通过类来访问
    public static $name = '超人';

    // 普通成员变量
    public $address = '华盛顿';

    // 静态方法,通过类来访问
    public static function action(){
        echo '镭射眼~~~~~~';
    }

    // 普通方法
    public function showInfo(){
        // 使用static 修饰的类变量或者方法时,需要通过 类名::xxx 的形式来访问
        echo '姓名:'.Superman::$name.'<br>地址:'.$this->address;
    }
}

// static 修饰的,无需实例化即可通过类名来调用
echo Superman::$name;
Superman::action();
echo '<hr>';
// 实例化对象,通过对象调用非static修饰的
$sp = new Superman();
$sp->showInfo();

在这里插入图片描述

9.final

final修饰的类,无法被继承,final修饰的方法无法被重写。

10. this ,self ,parent

this,self,parent三个关键字之间的区别,从字面上比较好理解,分别是指这、自己、父亲。

在类里面调用当前类的属性和方法有三种方法,分别是self、parent、$this,这三个关键字的区别是self用来指向当前的类;parent用于指向当前类的父类,可以使用该关键字调用父类的属性和方法;$this用来在类体内调用自身的属性和方法。

(1) this

$this表示当前实例,在类的内部方法访问未声明为const及static的属性时,使用$this->value='phpernote';的形式。

常见用法如:
$this->属性
$this->方法

// 在get,set方法中,this频繁的使用,用来指定当前的实例的属性或者方法
class Man {

    public $name ;

    public  $age;

    public function __construct($name, $age)
    {
        $this->name = $name;
        $this->age = $age;
    }


    public function getName()
    {
        return $this->name;
    }


    public function setName($name): void
    {
        $this->name = $name;
    }


    public function setAge($age): void
    {
        $this->age = $age;
    }

    public function getAge()
    {
        return $this->age;
    }


}

(2) self

self用来指向当前的类

<?php

class Person{
    function name(){
        echo '类名'.get_class($this).'<br>';
    }
}

class Man extends Person {

    function name(){
        echo '类名'.get_class($this).'<br>';
    }

    function nameSelf(){
       self::name();
    }

}

$m1 = new Man();
$m1->name();
$m1->nameSelf();

echo '<hr>';
$p = new Person();
$p->name();

在这里插入图片描述

(3) parent

parent用于指向当前类的父类,可以使用该关键字调用父类的属性和方法

<?php

class Person{

    function say(){
        echo 'hi'.'<br>';
    }
}

class Man extends Person {

   function saySomething(){
       parent::say();
       self::say();
   }

   function say()
   {
      echo 'hello'.'<br>';
   }
}

$m1 = new Man();
$m1->saySomething();
// hi
// hello

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

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

相关文章

520到了还有人不会表白吗——Python GUI实现爆火抖音的弹窗表白

文章目录 源码1.正常版本2.BT(变态)版本 代码实现(正常版本)结束语 最近抖音爆火的窗口表白 心中的女孩如果收到了&#xff0c;肯定会看着满屏幕的窗口感动不止&#xff0c;对你倾心 本文是正常版本的源码&#xff0c;BT版本的源码链接待审核 源码 1.正常版本 点击喜欢或者不喜…

【Linux】KMP算法

目录 主题 橙色 主题 好了&#xff0c;解释清楚这个表是什么之后&#xff0c;我们再来看如何使用这个表来加速字符串的查找&#xff0c;以及这样用的道理是什么。如图 1.12 所示&#xff0c;要在主字符串"ababababca"中查找模式字符串"abababca"。 如果在…

源码解读guava cache get方法的秘密

guava cache是谷歌开源的一种本地缓存&#xff0c;实现原理类似于ConcurrentHashMap&#xff0c;使用segments分段锁&#xff0c;保证线程安全&#xff0c;支持高并发场景。同时支持多种类型的缓存清理策略&#xff0c;包括基于容量的清理、基于时间的清理、基于引用的清理等。…

嵌入式系统中常见的摄像头接口

MIPI CSI&#xff1a;MIPI CSI&#xff08;Mobile Industry Processor Interface Camera Serial Interface&#xff09;是一种专用于手机和移动媒体设备的摄像头接口标准。它具有高速传输、低功耗和可靠性等优点&#xff0c;已经成为现代嵌入式摄像头的主要接口之一。 USB cam…

day31_JDBC

今日内容 零、 复习昨日 一、数据库连接池 二、反射 三、封装DBUtil 零、 复习昨日 三表关联 create table teacher ( tid int, tname varchar(10) ) insert into teacher values(1,老邱); insert into teacher values(2,老王);-- 三表关联 -- 查询学生以及班级信息 select * f…

FPGA实现Cordic算法求解arctan和sqr(x*2 + y* 2)

一. 简介 由于在项目中需要使用的MPU6050&#xff0c;进行姿态解算&#xff0c;计算中设计到**arctan 和 sqr(x2 y 2),**这两部分的计算&#xff0c;在了解了一番之后&#xff0c;发现Cordic算法可以很方便的一次性求出这两个这两部分的计算。另外也可以一次性求出sin和cos的…

MHA高可用配置及故障切换

单组mha 多组mmm mha &#xff08;master high availability&#xff09; mha解决mysql单点的问题 mysql故障切换的过程中最大程度上保证数据的一致性&#xff0c;一达到真正意义上的高可用 mha组成 mha node&#xff08;数据节点&#xff09; mha node 运行在每个mysql服…

数据库 SERVERLESS 与 RDS 产品逐步淘汰 和 云数据库的价值

开头还是介绍一下群&#xff0c;如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题&#xff0c;有需求都可以加群群内有各大数据库行业大咖&#xff0c;CTO&#xff0c;可以解决你的问题。加群请联系 liuaustin3 &#xff0c;在新加的朋友会分到2群&#xff08;共…

HTML + CSS + JavaScript 实现注册页面信息验证 详细教程(表单验证)

>>> 本文介绍使用HTML CSS JavaScript 实现注册页面信息验证的详细方法。完整代码见文章末尾。 要求 创建一个注册页面&#xff0c;如下图。 然后再对注册信息进行判断&#xff0c;判断其是否符合要求。&#xff08;如&#xff1a;密码6-12位字符&#xff0c;不能…

Unity通过深度图做有交互效果的水泡沫

通过深度图做交互水泡沫 大家好&#xff0c;我是阿赵。 这里做一个有交互效果的水面&#xff0c;物体浸入水面时&#xff0c;会根据物体的形状&#xff0c;有一圈水泡沫的效果&#xff0c;并且水泡沫的形状会跟随这物体变化。由于想做得稍微完整一点&#xff0c;又不想其他效果…

ipad可以用别的品牌的手写笔吗?便宜的ipad电容笔

而对于那些把ipad当做学习工具的人而言&#xff0c;苹果Pencil就成了必备品。但因为苹果Pencil太贵了&#xff0c;学生们买不起。因此&#xff0c;最好的选择还是平替电容笔。作为一个ipad的忠实用户&#xff0c;同时也是一个数字热爱着&#xff0c;这两年来&#xff0c;我一直…

谈谈ChatGPT对中国教育的影响与挑战,我们该怎么办?

ChatGPT对中国教育的影响 1. 个性化教学 通过分析学生的学习习惯和问题&#xff0c;AI可以为每个学生提供个性化的学习路径。例如&#xff0c;如果一个学生在数学上表现出困难&#xff0c;AI可以提供更多的数学练习和教学资源。 2. 在线教育 AI可以作为在线课程的一部分提供帮助…

verilog手撕代码5——计数器(置位、加减、环形、扭环形、格雷码计数器实现)

文章目录 前言一、二进制计数器&#xff08;n位 2^n状态&#xff09;1.1 可置位计数器1.2 加减计数器 二、环形计数器&#xff08;n位 n状态&#xff09;2.1 移位寄存器首尾相连构成环形计数器 三、扭环形计数器/Johnson计数器&#xff08;n位 2*n状态&#xff09;3.1 移位寄存…

路径规划算法:基于海鸥优化的路径规划算法- 附代码

路径规划算法&#xff1a;基于海鸥优化的路径规划算法- 附代码 文章目录 路径规划算法&#xff1a;基于海鸥优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要&#xff1a;本文主要介绍利用智能优化算法海鸥…

带头双向循环链表原来这么简单?

☃️个人主页&#xff1a;fighting小泽 &#x1f338;作者简介&#xff1a;目前正在学习C语言和数据结构 &#x1f33c;博客专栏&#xff1a;数据结构 &#x1f3f5;️欢迎关注&#xff1a;评论&#x1f44a;&#x1f3fb;点赞&#x1f44d;&#x1f3fb;留言&#x1f4aa;&…

win/mac电脑最好用的录屏软件Camtasia 2023官方中文版

Camtasia 2023专业的屏幕录制和视频剪辑软件 3000多万专业人士在全球范围内使用Camtasia展示产品&#xff0c;教授课程&#xff0c;培训他人&#xff0c;以更快的速度和更吸引人的方式进行沟通和屏幕分享。使您在Windows和Mac上进行录屏和剪辑创作专业外观的视频变得更为简单。…

Kali-linux使用Maltego收集信息

Maltego是一个开源的漏洞评估工具&#xff0c;它主要用于论证一个网络内单点故障的复杂性和严重性。该工具能够聚集来自内部和外部资源的信息&#xff0c;并且提供一个清晰的漏洞分析界面。本节将使用Kali Linux操作系统中的Maltego&#xff0c;演示该工具如何帮助用户收集信息…

【LeetCode】312. 戳气球

312. 戳气球&#xff08;困难&#xff09; 解法一&#xff1a;动态规划 首先看一个区间&#xff1a; 区间(i,j) 是一个开区间&#xff0c;因为我们只能戳爆 i 和 j 之间的气球&#xff0c;不能戳爆索引为 i 和 j 的气球。 我们不妨考虑该区间内被戳爆的最后一个气球&#xff…

UNIAPP框架中获取当前定位信息

概述 准备生成自己的Android证书。高德地图生成自己的key并配置mainfest.json。设置左上角图标并完成配置。页面中获取经纬度坐标。依据经纬度坐标获取位置信息。更新图标信息完成展示。 第一步&#xff1a;生成Android证书 参考资料 Android平台云端打包证书使用说明 https…

java类和对象之认识1

文章目录 一、Java类二、Java成员变量三、Java方法四、Java类的构造方法五、Java创建对象六、Java使用对象七、Java对象的引用和实体八、Java类与程序的基本结构九、Java参数传值总结 一、Java类 类是组成Java程序的基本要素&#xff0c;一个Java应用程序就是由若干个类所构成…