搜索
首页后端开发php教程归纳总结PHP对象基础

本篇文章给大家带来了关于PHP中的相关知识,其中主要介绍了面向对象的相关问题,面向对象编程的本质是增加数据和功能的操作主体即对象,希望对大家有帮助。

归纳总结PHP对象基础

推荐学习:《PHP教程

实践学习php,thinkphp,Redis,vue,uni-app等技术,推荐开源电商系统likeshop,可以借鉴思路,可去版权免费商用,gitee下载地址:
点击进项目地址

面向对象:OOP(objected oriented programming)编程

面向过程是一种编程思想

面向对象编程的本质是增加数据和功能的操作主体,即对象

面向对象中的所有的数据和功能多是由主体(对象)来调用和操作

面向对象基础

面向过程和面向对象区别

image-20210130153514844

面向对象关键字

  • 类:class,定义面向对象主体的最外层结构,用来包裹主体的数据和功能(函数)
  • 对象:object,某类事务的具体代表,又称为实例
  • 实例化:new,类产生对象的过程
  • 类成员:member
    • 方法:method,本质是在类class结构中创建的函数,称之为成员方法或者成员函数
    • 属性:property,本质是在类class结构中创建的变量,称之为成员变量
    • 类常量:const,本质是在类class结构中创建的常量

创建对象

<?phpclass People{}$man=new People();# 实例化类,man就是对象var_dump($man);?>
    # 输出object(People)#1 (0) { }
    #1表示:对象编号,与类无关,是整个脚本中对象的序号(0)表示:成员变量(属性)个数{}表示:具体成员变量信息(键值对)

类对象

<?phpclass Buyer{
    # 常量声明
    const BIG_NAME=&#39;BUYER&#39;;
    # 常量不需要加 $

    # 属性声明
    # $name;
    # 错误的,类内部属性必须使用访问修饰限定符
    public $name;
    public $money=0;
    
    # 方法声明
    function display(){
        echo __CLASS__;
        # 魔术常量,输出类名
        # 方法内部变量属于局部变量
    }}# 实例化$a = new Buyer();# 属性操作,增删改查echo $a->money;$a->money='20';$a->sex='male';unset($a->name);echo '<br>';# 方法操作$a->display();echo '<br>';var_dump($a);?>
    # 输出0Buyerobject(Buyer)#1 (2) { ["money"]=> string(2) "20" ["sex"]=> string(4) "male" }

注意:类常量不是由对象来进行访问

访问修饰限定符

在属性或者方法前的修饰关键字,用来控制属性或者方法的访问位置

  • public:公有,类内和类外都可以访问
  • protected:受保护,只允许在相关类内部访问
  • private:私有,只允许在定义类内部访问

属性必须有访问修饰限定符,方法可以没有访问修饰限定符,默认就是 public

类内部对象

$this,方法内部内置的一个对象,会自动指向来调用的方法的对象

$this 存在于方法内部(仅限内部使用),所以相当于在类的结构内部

  • 可以访问任意访问修饰限定符修饰的成员
  • 私有成员都是通过公有方法来实现访问(公有方法可以在类外部访问)
<?phpclass Article{
    protected $name = &#39;a&#39;;
    private $type = &#39;art&#39;;

    public function get_name()
    {
        var_dump($this);
    }}$a = new Article();var_dump($a);?>
    # 输出object(Article)#1 (2) { ["name:protected"]=> string(1) "a" ["type:private"]=> string(3) "art" }

$this 代表的是对象,而 $this 所在环境为类内部的方法内部,所以 $this 对象是在类内部访问,因此所有的属性和方法,不受访问修饰限定符限制

image-20210201090314602

image-20210201090809302

image-20210201095446499

构造方法

  • __construct() 是一种系统内置的魔术方法,该方法的特性是在对象实例化之后,对象立即自动调用

  • 构造方法的目的就是为了初始化资源,包括对象属性和其他资源

  • 一旦构造方法定义好后,且构造方法自带参数,那么就只能使用 new 类名(参数列表) 方式才能正确实例化

  • 魔术方法也可以通过对象直接调用的方式调用,不过没有实际用处

<?phpclass Article{
    public $name=&#39;xiaoli&#39;;
    private $sex="male";

    public function __construct($name,$sex)
    {
        $this->name = $name;
        $this->sex = $sex;
    }}$a = new Article('xiaowang', 'famale');var_dump($a);?>

析构方法

  • __destruct(),对象在被销毁时自动调用,释放资源
  • 对象销毁
    1. 对象无变量指向(变量指向其他数据)
    2. 对象被主动销毁(unset销毁对象变量)
    3. 脚本执行结束(自动释放资源)
  • PHP 脚本执行结束会释放所有资源,所以一般较少用析构方法
<?phpclass Article{
    protected $name = &#39;xiaoli&#39;;
    private $sex = &#39;famale&#39;;

    public function __destruct()
    {
        // TODO: Implement __destruct() method.
        echo __FUNCTION__;
    }}$a=new Article();# 销毁对象$a=1;unset($a);# __destructendecho &#39;end&#39;;?>
    # 不销毁对象,php在运行结束也会释放资源# end__destruct

对象传值

定义:将保存对象的变量赋值给另外一个变量

在 PHP 中,对象的传值是引用传递:即一个对象变量赋值给另外一个变量,两个变量指向同一个对象地址,即只有一个对象

<?phpclass Article{
    public $name = 'xiaoli';
    public $sex = 'famale';}$a=new Article();$b=$a;var_dump($a,$b);echo '<br>';$a->name="wangxiaohu";var_dump($a,$b);echo '<br>';?>
    # 输出object(Article)#1 (2) { ["name"]=> string(6) "xiaoli" ["sex"]=> string(6) "famale" } object(Article)
    #1 (2) { ["name"]=> string(6) "xiaoli" ["sex"]=> string(6) "famale" }object(Article)
    #1 (2) { ["name"]=> string(10) "wangxiaohu" ["sex"]=> string(6) "famale" } object(Article)
    #1 (2) { ["name"]=> string(10) "wangxiaohu" ["sex"]=> string(6) "famale" }

范围解析操作符(类常量访问)

有两个冒号组成 “::” ,专门用于类实现类成员操作,可以实现类直接访问类成员

  • 范围解析操作符是用于给类(类名)访问类成员使用的

    类名::类成员
  • 范围解析操作符也可以被对象用来当作类使用(不建议)

    $对象名::类成员
  • 类常量只能被类访问

<?phpclass Article{
    const  NAME=&#39;ocean&#39;;}echo Article::NAME;
    # 常量是不能通过 Article->NAME 来进行访问的$a=new Article();echo $a::NAME;
    # 范围解析操作符兼容对象,找到对象所属类最终进行访问,效率降低,灵活性提高?>

类常量是固定的,而对象的属性是不同对象不同的

image-20210201115041335

静态成员

定义:使用 static 关键字修饰的类成员,表示该成员属于类访问

  • 静态成员
    • 静态属性
    • 静态方法
  • 静态成员是明确用来给类访问的,而不是对象
  • 静态成员只是多了一个 static 关键字修饰,本身也可以被对象访问
  • 静态成员同样可以使用不同的访问修饰限定符限定,效果一致

image-20210201133428850

<?phpclass Article{
    public static $name = &#39;hlm&#39;;
    public static $type = &#39;art&#39;;

    public static function getName()
    {
        return self::$name;
    }}# 静态属性$a = new Article();echo Article::$name;# 静态方法echo Article::getName();?>

self关键字

  • 在类的内部(方法里面)使用,代替类名的写法
  • self 如同 $this 代表内部对象一样,能够在方法内部代替当前类名
  • 能够保障用户方便修改类名字
  • self 关键字是代替类名,所以需要配合范围解析操作符 ::
<?phpclass Article{
    public static function getInstance1()
    {
        return new self();
    }

    public static function getInstance2()
    {
        return new Article();
    }}$a = Article::getInstance1();$b = Article::getInstance2();var_dump($a,$b);?>
    # 输出object(Article)
    #1 (0) { } object(Article)
    #2 (0) { }

类加载

类的访问必须保证类在内存中已经存在,所以需要再用类之前将类所在的 PHP 文件加载到内存中

  • 类的加载分为两种

    • 手动加载:在需要使用类之间通过 include 将包含类的文件引入到内存
    • 自动加载:提前定义好类结构和位置,写好引入类文件代码,在系统需要类而内存不存在的时候想办法让写好的加载类的代码执行(自动加载是自动运行写好的加载类的代码)
  • 自动加载两种方式

    • 魔术函数 __autoload:系统自动调用,需要传入类名,在函数内部实现类的手动加载(PHP7及之后不建议使用此方法)
    function __autoload($classname){
        # 找到对应的文件路径和命名规范,手动加载}
     
    • 自定义函数:自己定义类的加载实现,然后通过 spl_autoload_register 注册到自动加载机制(可注册多个自动加载)
    # 自定义类加载函数function 自定义函数($classname){
        # 找到对应的文件和命名规范,手动加载}#注册自动加载sql_autoload_register('自定义函数名字')

自动加载要求在声明类的时候有良好的规范

  • 类名与文件名一致:类名.php 或者 类名.class.php
  • 类文件分类放好

image-20210201144541271

例:手动加载

image-20210201145934549

Article.php

<?phpclass Article{
    public function getName(){
        return __METHOD__;
    }}

mian.php

<?php# include &#39;Article.php&#39;;# 直接加载比较消耗资源,而且如果类已经在内存中存在,直接include会报错,建议判断后再加载if(!class_exists(&#39;Article&#39;)){
    include &#39;Article.php&#39;;}$a=new Article();var_dump($a->getName());
    # outputstring(16) "Article::getName"

自动加载

  • __autoload(不建议使用)

一个系统中,可能类文件会放到不同的路径下,因此一个完整的自动加载函数,应该要进行文件判定功能

<?php
function __autoload($classname){
    # 形参代指 类名
    #组织文件路径,假设当前路径下,有两个文件夹下都有类c和类m
    $c_file = &#39;c/&#39; . $classname . &#39;.php&#39;;
    if (file_exists($c_file)) {
        include_once($c_file);
        return true;
    } 
    //if 语句如果只有一行不需要加 {}
    //include_once 只加载一次

    $m_file = &#39;m/&#39; . $classname . &#39;.php&#39;;
    if (file_exists($m_file)) {
        include_once($m_file);
        return true;
    }
}


$a=new Article();
$b=new Article();
  • spl_autoload_register
<?phpfunction autoload01($classname){
    if(!class_exists($classname)){
        $file_name=$classname.&#39;.php&#39;;
        if(file_exists($file_name)) include_once $file_name;
    }}spl_autoload_register(&#39;autoload01&#39;);$a=new Article();

对象克隆

通过已有的对象复制一个新的同样的对象,但两者之间并非同一个对象

image-20210201161635978

image-20210201161616688

面向对象高级

面向对象三大特性

封装、继承、多态

类的封装

image-20210201171024833

类的继承

inherit,子类合法拥有父类的某些权限

  • 继承必须满足继承关系:即存在合理的包含关系
  • 继承的本质是子类通过继承可以直接使用父类已经存在的数据和数据操作
  • PHP 使用 extends 关键字表示继承

子类也称派生类

父类也称基类

# 父类class Human{}# 子类继承class Man extends Human{}

类的多态

多态性是指相同的操作或函数、过程可作用于多种类型的对象上并获得不同的结果

  • 需要发生类的继承,同时出现方法的重写(override),即子类拥有与父类同名的方法
  • 在实例化对象的时候让父类对象指向子类对象(强制类型,PHP不支持,PHP 弱类型很灵活)
  • 结果:父类对象表现的子类对象的特点

image-20210201190338257

—PHP继承—

<?phpclass Human{
    public function show(){
        echo __METHOD__;
    }}class Man extends Human{}$m=new Man;$m->show();

有限继承

子类在继承父类的成员时,并非继承所有内容,而是继承并使用父类部分内容

  • PHP 中继承的本质是对象继承
  • PHP 中继承的内容:父类所有公有成员、受保护成员和私有属性,私有方法不能继承
  • 受保护(protected)成员专于继承,可以在父类或者子类内部访问
  • 私有成员的访问只能在所属类中设定公有或者受保护方法实现访问
  • 构造方法和析构方法可以被子类继承,

重写 Override

override,子类中定义了与父类重名的成员

image-20210202091754458

parent 关键字

一种明确访问父类成员的表达方式

image-20210202092320773

方法被重写后,访问调用的是子类方法,如果想要访问父类方法,可以通过在子类方法中使用 parent 来强制访问父类方法

parent 不能用于访问父类的属性(静态属性可以)

PHP 继承特点

  • PHP 只能单继承,只有一个父类(若继承多个类,可以使用链式继承)
  • PHP 继承中,只有私有方法不能继承
  • PHP 允许继承父类中的构造方法和析构方法

静态延迟绑定

image-20210202093514060

image-20210202093932752

最终类 Final

使用 final 关键字修饰类名,表示此类不可以被继承

final 关键字还能修饰方法,表示方法不能被重写(通常此时类不会使用 final 关键字)

image-20210202094929480

抽象类 Abstract

使用 abstract 关键字修饰的类,表示该类只能被继承,不能被实例化

abstract 关键字可以修饰方法,表示方法为抽象方法,抽象方法没有方法体(没有{})

抽象方法存在的类必须为抽象类

继承抽象类的类要么为抽象类,要么实现抽象类里所有的抽象方法

trait 代码复用

image-20210203135531893

适用于,不同类之间有公共代码,但是类彼此关系不存在继承关系,此时可以将公共代码存储到 trait 中

trait 内部可以拥有一个类能拥有的成员属性(包括静态),成员方法(包括静态和抽象方法),但不能有类常量

trait 用来代码复用,不能被实例化,不能被继承

trait 同名

一个类中可能需要引入多个 trait ,而不同 trait 中可能出现同名

image-20210203141318530

接口

Interface,专门用来规范一些共性类必须实现的方法

  • 接口不是类,但是与类有类似的结构
  • 接口不能实例化,类可以实现接口

interface 接口名字{}

class 类名 implements 接口名字{}

image-20210203145047924

接口成员

接口成员只能有两类

  • 接口常量:const
  • 共有的接口方法(普通方法和静态方法)

image-20210203145534966

PHP 重载

overload,指在一个类中可以出现多个同名方法,彼此之间的参数个数和类型不一样

image-20210203190348714

用来容错

属性重载

当对象访问不存在的或者权限不够的属性的时候,自动触发魔术方法让代码不出错

属性重载魔术方法

  • __get(属性名):访问不存在或者权限不够的属性时触发
  • __set(属性名,属性值):设置不存在或者权限不够的属性时触发
  • __isset(属性名):判定不存在或者权限不够的属性是触发
  • __unset(属性名):删除不存在或者权限不够的属性时触发
  • __tostring(): 当作字符串

方法重载

对象或者类访问不存在或者权限不够的方法,自动触发的魔术方法让代码不出错

  • __cal(方法名,方法参数列表):调用不存在或者权限不够的方法时触发
  • __callStatic(方法名,方法参数列表):调用不存在或者权限不够的静态方法时触发

对象遍历

将对象中的所有属性以键值对的形式取出并进行访问

  • 对象是一种复合数据类型,对象中真正保存的内容是属性

  • 对象的属性本质也是一种键值对关系:名字 = 值

  • 对象遍历就是利用 foreach 对对象中的属性进行取出解析

  • 对象遍历遵循访问修饰限定符的限定:即类外只能遍历所有共有属性

    foreach(对象变量 as [属性名变量 =>] 属性值变量){
        #属性名变量代表取出的每个属性的名字
        #属性值变量代表取出的每个属性的值}

    image-20210204090232316

Iterator 迭代器

image-20210204090552234

生成器

image-20210204092053300

image-20210204091506575

yield 关键字

设计模式

design pattern,是软件开发人员在软件开发过程中问题的解决方法

单例模式

singleton,是一种类的设计只会最多产生一个对象的设计思想image-20210204092904886

保证资源唯一性

工厂模式

。。。。。。

命名空间

namespace,指人为的将内存进行分隔,让不同内存区域的同名结构共存,从而解决在大型项目能出现重名结构问题

image-20210204095323759

基础语法:

namespace 关键字定义空间

命名规则

字母、数字、下划线,不能以数字开头

命名空间必须写在所有代码之前,定义了一个,之后可以定义多个

image-20210204100804279

子空间

subspace,即在已有空间之上,再在内部进行空间划分

子空间直接通过 namespace+路径符号 \ 实现

非限定名称

直接访问元素本身,代表当前所属空间(当前目录)

限定名称

使用空间名+原名,代表访问当前空间子空间(当前目录子目录)

完全限定名称

从根目录(全局空间)开始访问,使用 \ 作为全局空间开始符号(根目录)

全局空间元素访问:使用完全限定名称访问

image-20210204140347426

命名空间引入

image-20210204141027952

推荐学习:《PHP视频教程

以上是归纳总结PHP对象基础的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文转载于:CSDN。如有侵权,请联系admin@php.cn删除
使用数据库存储会话的优点是什么?使用数据库存储会话的优点是什么?Apr 24, 2025 am 12:16 AM

使用数据库存储会话的主要优势包括持久性、可扩展性和安全性。1.持久性:即使服务器重启,会话数据也能保持不变。2.可扩展性:适用于分布式系统,确保会话数据在多服务器间同步。3.安全性:数据库提供加密存储,保护敏感信息。

您如何在PHP中实现自定义会话处理?您如何在PHP中实现自定义会话处理?Apr 24, 2025 am 12:16 AM

在PHP中实现自定义会话处理可以通过实现SessionHandlerInterface接口来完成。具体步骤包括:1)创建实现SessionHandlerInterface的类,如CustomSessionHandler;2)重写接口中的方法(如open,close,read,write,destroy,gc)来定义会话数据的生命周期和存储方式;3)在PHP脚本中注册自定义会话处理器并启动会话。这样可以将数据存储在MySQL、Redis等介质中,提升性能、安全性和可扩展性。

什么是会话ID?什么是会话ID?Apr 24, 2025 am 12:13 AM

SessionID是网络应用程序中用来跟踪用户会话状态的机制。1.它是一个随机生成的字符串,用于在用户与服务器之间的多次交互中保持用户的身份信息。2.服务器生成并通过cookie或URL参数发送给客户端,帮助在用户的多次请求中识别和关联这些请求。3.生成通常使用随机算法保证唯一性和不可预测性。4.在实际开发中,可以使用内存数据库如Redis来存储session数据,提升性能和安全性。

您如何在无状态环境(例如API)中处理会议?您如何在无状态环境(例如API)中处理会议?Apr 24, 2025 am 12:12 AM

在无状态环境如API中管理会话可以通过使用JWT或cookies来实现。1.JWT适合无状态和可扩展性,但大数据时体积大。2.Cookies更传统且易实现,但需谨慎配置以确保安全性。

您如何防止与会议有关的跨站点脚本(XSS)攻击?您如何防止与会议有关的跨站点脚本(XSS)攻击?Apr 23, 2025 am 12:16 AM

要保护应用免受与会话相关的XSS攻击,需采取以下措施:1.设置HttpOnly和Secure标志保护会话cookie。2.对所有用户输入进行输出编码。3.实施内容安全策略(CSP)限制脚本来源。通过这些策略,可以有效防护会话相关的XSS攻击,确保用户数据安全。

您如何优化PHP会话性能?您如何优化PHP会话性能?Apr 23, 2025 am 12:13 AM

优化PHP会话性能的方法包括:1.延迟会话启动,2.使用数据库存储会话,3.压缩会话数据,4.管理会话生命周期,5.实现会话共享。这些策略能显着提升应用在高并发环境下的效率。

什么是session.gc_maxlifetime配置设置?什么是session.gc_maxlifetime配置设置?Apr 23, 2025 am 12:10 AM

thesession.gc_maxlifetimesettinginphpdeterminesthelifespanofsessiondata,setInSeconds.1)它'sconfiguredinphp.iniorviaini_set().2)abalanceIsiseededeedeedeedeedeedeedto to to avoidperformance andununununununexpectedLogOgouts.3)

您如何在PHP中配置会话名?您如何在PHP中配置会话名?Apr 23, 2025 am 12:08 AM

在PHP中,可以使用session_name()函数配置会话名称。具体步骤如下:1.使用session_name()函数设置会话名称,例如session_name("my_session")。2.在设置会话名称后,调用session_start()启动会话。配置会话名称可以避免多应用间的会话数据冲突,并增强安全性,但需注意会话名称的唯一性、安全性、长度和设置时机。

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

SublimeText3 英文版

SublimeText3 英文版

推荐:为Win版本,支持代码提示!

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

WebStorm Mac版

WebStorm Mac版

好用的JavaScript开发工具

mPDF

mPDF

mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),