PHP之析构函数

article/2025/9/26 1:55:33

随着面向对象编程的普遍展开,面向对象展现了其中很多有趣的问题。相信很多初学者学习php面向对象时会接触两个函数,构造函数与析构函数。构造函数似乎用的更多,析构函数用的较少(相对初学者有限编程经验而言,笔者也是如此。)在功能上,构造函数在创建对象时调用,析构函数在对象销毁时调用,都无需特意去调用,一头一尾,倒也是前后照应。

  析构函数常常处理的事务是一些资源释放的工作,比如前面有fopen(),这里调用fclose(),前面有imagecreatefromjepg(),这里调用imagedestory(),这些都是些常见的例子,当然不局限于此。我们大可将其当做一个普通的会在对象销毁或者脚本执行完毕的时候执行的函数。

  啰嗦那么多,还是尽早提出今天的主要的问题:

复制代码

<?php
class Test{public function __destruct(){echo "执行析构函数";}}
$test1=new Test;
$test2=$test3=$test1;
unset($test1);
echo "<hr/>";

复制代码

  这段脚本执行结果是什么?

  在回答这个问题之前,回看我上面标示的几个字。我们可以理所应当的认为在输出分隔线前 unset($test1) ,这样会调用析构函数,输出文字,至于 $test2,$test3 应该会在脚本执行完毕调用析构函数。也就是说,在分割线上面,会输出一段文字,分隔线下面会输出两段文字。 在这个时候,大可以小骄傲一下,毕竟自己懂得什么时候调用析构函数。但现实真是如此么?我们可以看一下执行结果。

  

  嘿,他喵的,怎么就输出了一句啊???

  其实我们忽略了一个重要的前提条件,就是对象的赋值默认的是引用赋值。这一点很多人没有注意到,希望初学者能多多注意一下。

  那么既然是引用赋值,结合我们对普通变量的理解,我们很快想到,三个变量名指向同一块存储地址。那么既然如此的话, unset($test1) 起到的是什么作用???破坏变量指向存储地址还是破坏存储地址存储的内容?

  了解unset()函数用法的请直觉跳过本段。

  想着这蛋疼的问题,莫不如去查看手册。

  同样是传递引用,毁掉的仅仅是变量名指向存储地址。结合平常unset()的作用,我们可以这么描述,当多个变量名或者对象名指向一块存储地址时,unset()函数的作用仅仅是销毁变量名和存储地址的指向而已,当仅有一个变量名或者对象名,unset销毁的是指定的存储地址上的内容。

  我们可以想象真实的存储内容是一台电视。多个人(多个变量名或对象名)在看一台电视。unset()后,一个人不看了,离开了,电视还开着。当只有一个人看电视的时候,unset()后,人离开的时候,要把电视关了 ,也就是释放占用的存储空间。对这部分内容感兴趣的话也可以看一下《php 递归函数的三种实现方式》。

  

  好的,回归主题。 unset($test1) 后, 原来的对象还在。当输出分割线后,脚本执行完毕,调用析构函数。 因为对象只有一个,调用析构函数也只调用一次。输出如上结果也就理所应当。

 

  其他几个相关的有意思的问题:在程序中调用析构函数的方法还有很多。无论是设置对象为null,还是false,其余的对象依旧不受影响。这和普通变量还是有区别的。(unset()函数的效果是一样的)。有兴趣的话可以试试。

  另外说一个比较囧的事情:我们都知道构造函数可以使用__construct(),却忽视了同名构造函数。所以,大家还是留心一下。


http://chatgpt.dhexx.cn/article/FuFcR9L1.shtml

相关文章

PHP构造函数(方法)的使用

什么是构造方法&#xff08;函数&#xff09;&#xff1f; 构造&#xff08;函数&#xff09;方法是类中的一个特殊方法。当使用 new 操作符创建一个类的实例时&#xff0c;构造方法将会自动调用&#xff0c;其名称必须是 __construct(&#xff09;。 在一个类中只能声明一个构…

构造函数

构造函数在类体里的声明形式&#xff1a; 类名&#xff08;形参一&#xff0c;形参二&#xff0c;…&#xff09;&#xff1b;//也可以没有形参 构造函数的定义形式&#xff1a; 假设数据成员为x1&#xff0c;x2&#xff0c;…x&#xff0c;类外定义构造函数时通常有3种形式&am…

php类中的构造函数与析构函数

1.php类中的构造函数a.构造函数的定义及创建 构造函数的英文是constructor&#xff0c;通常是和析构函数配合使用的。 所谓构造函数&#xff0c;就是在我们这个类运行之初需要初始的东东&#xff0c;执行类中所有方法之前&#xff0c;无需首先执行的方法。看个例子&#xff0c;…

PHP笔记-PHP中构造函数要注意的地方

背景 这里记录下PHP中构造函数的注意点。 这里和C/C、Java不一样&#xff0c;比较灵活&#xff0c;估计是有隐式调用&#xff0c;在此不研究了&#xff0c;记录下注意的地方。 演示 如下项目&#xff1a; Base.php <?phpclass Base{public function __construct(){ech…

php构造方法(函数)基础

什么是构造函数呢?在回答这个问题之前&#xff0c;我们来看一个需求&#xff1a;我们在创建人类的对象时&#xff0c;是先把一个对象创建好后&#xff0c;再给他的年龄和姓名属性赋值&#xff0c;如果现在我要求&#xff0c;在创建人类的对象时&#xff0c;就指定这个对象的年…

ffmpeg编译安装

ffmpeg编译安装 前言一、下载ffmpeg二、编译安装2.1 Linux编译ffmpeg2.2 Windows编译ffmpeg 总结 前言 Fmpeg是一套可以用来记录、转换数字音频、视频&#xff0c;并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。它…

在Windows上安装FFmpeg程序

原文地址:http://helloway.blog.51cto.com/7666282/1642247 FFmpeg是一套可以用来记录、转换数字音频、视频&#xff0c;并能将其转化为流的开源计算机程序。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库libavcodec。 该程序只有命令…

【最新】windows电脑FFmpeg安装教程手把手详解

【最新】FFmpeg安装教程手把手详解 写在前面一、下载&解压二、配置环境变量1、配置系统环境变量 三、验证额外补充 写在前面 本文以 Windows 64 位操作系统为例演示 一、下载&解压 打开 FFmpeg 官网&#xff0c;选择下载。 选择 Windows 平台&#xff0c;下面有两…

FFmpeg 安装与使用

官方介绍&#xff08;可忽略&#xff09; FFmpeg是处理多媒体内容&#xff08;如音频、视频、字幕和相关元数据&#xff09;的库和工具的集合。它功能非常强大&#xff0c;包括视频裁剪、视频格式转换、视频截图、视频添加水印等。 它包含可供应用程序使用的libavcodec、libavu…

ffmpeg安装教程及配置环境

1.下载ffmpeg安装包 官网如下&#xff1a;https://ffmpeg.org/download.html 记住这个目录&#xff1a;E:\ffmpeg-4.4-essentials_build\bin 4. 5.打开 winR&#xff0c;cmd命令下检验 输入ffmpeg 此时安装&#xff0c;以及配置成功

Mac版 下载安装FFmpeg

​​​​​​​​​​​​​​本篇是在mac版下安装FFmpeg的&#xff0c;如果你的电脑为windows版的话&#xff0c;请移步到这篇文章ffmpeg下载安装教程及介绍_水w的博客-CSDN博客 目录 安装FFmpeg 方式一&#xff1a;官网下载安装 方式二&#xff1a;使用Homebrew安装FFmpeg…

Windows安装ffmpeg

目录&#xff1a; 一、官网下载ffmpeg安装包1、打开官网下载&#xff08;用迅雷下载会比谷歌浏览器下载快一点&#xff09;2、解压到想要安装的文件夹 二、添加环境变量1、打开安装目录下的bin文件夹&#xff0c;复制路径2、打开环境变量页面 三、测试 一、官网下载ffmpeg安装包…

2.ffmpeg安装(Ubuntu20.04 )

Ubuntu20.04安装ffmpeg 1.下载源码包2.解压安装依赖库 3.编译3.1 安装 yasm3.2 配置3.3 编译安装 4.添加环境变量4.1 修改环境变量4.2 在文件中添以下内容。4.3 设置生效 5.验证是否成功5.1 无法打开共享库文件5.2 测试是否配置成功 注意 1.下载源码包 进入官网 https://ffmpe…

ffmpeg的安装和使用教程

ffmpeg的安装和使用教程 1.进入ffmpeg官网&#xff0c;下载相应的安装包,windows和mas以及linux&#xff0c;32位和64位版本! 2.将下载好的压缩包进行解压 3.进入bin目录&#xff0c;复制好bin目录的路径 4.右击此电脑&#xff08;win7就是计算机&#xff09;&#xff0c;选择…

ffmpeg的安装与使用

一、ffmpeg的简介 FFmpeg是一个自由软件&#xff0c;可以运行音频和视频多种格式的录影、转换、流功能&#xff0c;包含了libavcodec——这是一个用于多个项目中音频和视频的解码器库&#xff0c;以及libavformat——一个音频与视频格式转换库。 主要参数 -i——设置输入档名…

三、FFmpeg安装

1. FFmpeg介绍 FFmpeg是一个完整的、跨平台的解决方案&#xff0c;用于记录、转换和流化音/视频。 FFmpeg 采用 LGPL 或 GPL 许可证&#xff0c;提供了录制、转换及流化音/视频的完整解决方案。其包含了非常先进的音&#xff0f;视频编解码库 libavcodec。 FFmpeg 是在 Linux …

windows ffmpeg安装部署

目录 安装包下载 解压安装包 配置环境变量 总结 安装包下载 作为音视频处理重要软件ffmpeg&#xff0c;是一定要装好的。 windows安装包下在链接&#xff1a;资源包地址 解压安装包 下载安装包后解压到需要的目录。 配置环境变量 找到控制面板 -> 点击系统 -> 点击…

ffmpeg安装及使用

下载 下载地址&#xff1a;https://ffmpeg.org/download.html 然后按照下图点击&#xff0c;找到Release部分下载一个即可。 安装 所谓安装就是解压并配置“path”环境变量 将安装包解压至任意目录&#xff0c;比如我这里是D:\Program\ffmpeg-5.0.1-full_build 按照以下顺…

ffmpeg详细安装教程,亲测有效!

这两天整理好用的录屏软件&#xff0c;发现了Captura这个软件&#xff0c;软件本身的安装很简单&#xff0c;但由于Captura需要依赖ffmpeg&#xff08;一套可以用来记录、转换数字音频、视频&#xff0c;并能将其转化为流的开源计算机程序&#xff09;&#xff0c;而ffmpeg在安…

ffmpeg的下载及安装

最近在处理一些音频数据&#xff0c;ffmpeg是一款非常好用处理音视频的工具包。那什么是ffmpeg呢&#xff1f;FFmpeg是一套可以用来记录、转换数字音频、视频&#xff0c;并能将其转化为流的开源计算机程序&#xff0c;可以结合Java开发一些处理视频音频的功能。 1.ffmpeg下载…