在 php 中取消设置变量

2023-11-21

我刚刚通过 php 手册阅读了有关 unset 变量的内容。

php手册说“unset() 销毁指定的变量”

这个 def 看起来很完美,直到我遇到静态变量......“如果在函数内部 unset() 静态变量,则 unset() 仅在函数其余部分的上下文中销毁该变量。以下调用将恢复变量的先前值。”

至少对我来说,这个定义似乎不太好,因为“销毁变量”意味着该变量不再与该内存位置关联。

还有其他人认为更好的定义是“unset() 使变量超出当前范围”吗?我的意思是,与其指向生命周期,不如在这里使用单词范围?


让我们考虑一下这个函数:

function foo() {
    static $bar;
    $bar++;
    unset($bar);
}
foo(); //static $bar is 1
foo(); //static $bar is 2

该函数编译为:



function name:  foo
number of ops:  11
compiled vars:  !0 = $bar
line     # *  op                           fetch          ext  return  operands
---------------------------------------------------------------------------------
   2     0  >   EXT_NOP                                                  
   4     1      EXT_STMT                                                 
         2      FETCH_W                      static              $0      'bar'
         3      ASSIGN_REF                                               !0, $0
   5     4      EXT_STMT                                                 
         5      POST_INC                                         ~1      !0
         6      FREE                                                     ~1
   6     7      EXT_STMT                                                 
         8      UNSET_VAR                                                !0
   7     9      EXT_STMT                                                 
        10    > RETURN                                                   null
  

变量实际上存在于每个函数调用之外foo()并且,在每次调用时,都会获取它并对它的引用分配给$bar。事实上,它与此非常相似:

function foo() {
    global $bar;
    $bar++;
    unset($bar);
}

你打电话时unset(),您只是破坏了您创建的引用,而不是基础值。

我没有确认,但我猜发生的情况是这样的:

  • 存储变量的底层表示(zval),使其引用计数为 1。
  • When foo()被称为,符号$bar与此 zval 相关联,其引用计数增加到 2,并设置引用标志。
  • When unset被调用时,zval 的引用计数减少到 1,引用标志可能被清除,并且符号$bar已移除。

See 引用计数基础知识.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 php 中取消设置变量 的相关文章

  • URL 中的 %2F 中断并且未引用所需的 .php 文件 [重复]

    这个问题在这里已经有答案了 我需要将 作为变量作为 URL 的一部分传递 我的结构如下所示 www domain com listings page 1 city Burnaby South type Townhome bedroom 2
  • 保存多对多关系,同步/附加不存在?

    我有以下两个多对多关系的模型 use Illuminate Database Eloquent Model class Permission extends Model The database table used by the mode
  • Laravel leftJoin 仅右表的最后一条记录

    我是 Laravel 的新手 我有两张桌子 1 产品 2 价格 products id product int p key name varchar prices id price int p key id product int
  • 如何使用 PHP 对字符串进行 rot13 处理?

    我有一个很大的 php 代码 我想手动对其进行编码和解码 我的问题是 php 代码里面有很多单引号和双引号 因此我在使用时出现错误str rot13 功能如下 那么正确的语法是什么以及如何使用下面的函数进行编码 str rot13 That
  • CodeIgniter 自定义库未加载

    我是 CodeIgniter 的新手 并尝试用它开发一个相当简单的应用程序 只是一个用于处理想要娱乐中心通行证的员工的注册的表单 我正在尝试将事物分开以使它们更清晰 这是代码 应用程序 控制器 reccenter php class Rec
  • 无法访问 localhost/xampp/index.php

    我刚刚安装了 Windows 7 的 XAMPP 控制面板似乎工作正常 我启动了 MySql 和 Apache 我遇到的问题是 当我在浏览器 Google Chrome 中输入 localhost 时 它会将我发送到 http localh
  • PHP - 如何获取主要 HTML 内容,例如 Firefox 中的阅读器模式

    在 android Firefox 应用程序和 safari iPad 中 我们只能通过 阅读器模式 阅读主要内容 阅读更多 http support mozilla org en US kb how enable reader mode
  • Xdebug V3 不会停止 VSCode 中的断点

    我正在尝试使用 VSCode 在 XAMPP 上进行调试 但没有成功 我知道有很多关于这个的问题 我已经尽了一切努力 但仍然行不通 我的 xdebug 扩展确实有一件奇怪的事情 我目前使用 PHP v7 4 12 和 Xdebug 版本 3
  • 如何从网站网址中隐藏 .html 扩展名

    我知道这个问题以前曾被问过 但有人知道隐藏 html 扩展名的好方法吗 我已经尝试了许多代码和许多答案https stackoverflow com https stackoverflow com 但我没有看到结果 那是我再问你一次 我有一
  • 如何在 GitHub Action 中使用不同版本的 PHP 进行测试

    我有一些 PHP 代码 其中包含使用以下命令运行的测试PHPUnit并想对其进行测试GitHub Actions 我在他们的文档中找不到测试 PHP 包的方法 我想使用不同版本的 PHP 进行测试 但他们只有最新的版本7 3安装 您可以添加
  • 如何在 JavaScript 中创建服务器端进度指示器?

    我想在我的网站中创建一个部分 用户可以在其中进行一些简单的操作update纽扣 这些中的每一个update按钮将发送到服务器 并在幕后进行长时间的处理 当服务器处理数据时 我希望用户有某种进度指示器 例如进度条或文本百分比 我使用 jQue
  • 覆盖 FOS 用户包中的“更改密码”模板

    我做了一些研究 遗憾的是找不到任何帮助 因此 我将 FOSUserBundle ChangePasswordAction 渲染到我的模板中 但它显示供应商提供的默认模板 我的渲染控制器的模板 block body h2 Einstellun
  • PHP 中标头的使用

    非常简单的问题 这两个 PHP 版本 5 标头调用中哪一个是 最好的 header Not Modified true 304 header HTTP 1 1 304 Not Modified 我很确定第一个是最多价的 但只是好奇如果在 H
  • Laravel Vue 组件只能传递数字?

    在我的 UserMenu vue 中我写道 export default props nameVal data return 并在blade php中
  • Facebook PHP-SDK 页面刷新后似乎丢失了 userID

    我似乎登录工作正常 我可以登录 接受应用程序 第一次 然后显示用户信息 例如姓名 图片 等 然而 当我刷新页面时 userid 又回到 0 我必须再次登录 我不确定问题是什么 我必须在每次页面加载时重新启动它还是什么 我不知道 我会发布一些
  • 使用会话 php 创建 cookie?

    我使用会话来登录我网站中的用户 问题是 我想让用户remember密码 因此关闭 打开浏览器后他们不需要再次登录 我需要使用 cookie 和 session 来实现它吗 my code user POST user pass POST p
  • 矩形超出边界是什么意思

    PPB Graphics2D PaintImageData 矩形超出界限是什么意思 我几乎在我检查的每一段代码中都看到了它 最新的代码是 define my consumer key define my consumer secret oa
  • PayPal 网关已拒绝请求。安全标头无效(#10002:安全错误 Magento

    在 magento 中增加 PayPal 预付款 我已填写 magento admin 中的所有凭据 但是当我进入前端并单击 pay pal 按钮时 它给出了 PayPal 网关已拒绝请求 安全标头无效 10002 安全错误 我用谷歌搜索了
  • PHPUnit - 模拟 S3Client 无法正常工作

    库 aws aws sdk php 2 PHP 版本 PHP 5 4 24 cli 作曲家 json require php gt 5 3 1 aws aws sdk php 2 require dev phpunit phpunit 4
  • 如何从日期中查找该月的最后一天?

    如何在 PHP 中获取该月的最后一天 Given a date 2009 11 23 我要2009 11 30 并给出 a date 2009 12 23 我要2009年12月31日 t返回给定日期所在月份的天数 请参阅的文档date ht

随机推荐

  • 在 MySQL 中存储 SHA1 哈希值

    当我想将 SHA1 哈希结果存储在 MySQL 数据库中时 我有一个简单的问题 应该多长时间VARCHAR我存储哈希结果的字段是什么 我会用VARCHAR适用于可变长度数据 但不适用于固定长度数据 因为 SHA 1 值是always160位
  • 如何延迟一个转换而不延迟另一个转换?

    我设置了两个转换 circle 我只希望不透明度有延迟 但我只能在两个过渡都进行的地方进行延迟 我的全部目标是在圆圈处于中间旋转时 即正好 90 度 改变不透明度 但我会自己计算时间 我只想知道如何仅延迟一次转换 circle backgr
  • 图像在模拟器中显示,但在 iPhone 设备上不显示

    因此 当我从设备运行应用程序时 图片就会显示出来 一切都运行良好 然而 当我转到该设备时 我运行的 38 张图片中大约有 10 张没有显示 我正在从 sqlite 数据库中提取图像的名称 并且我已经检查过 名称 大小写和所有内容都是正确的
  • 在 Django 中实现“开放时间”的任何现有解决方案

    我正在为一位希望能够更改营业时间的客户制作一个网站 对于他的每一个不同的商店 Django 是否有针对此类问题的现有解决方案 你是什 么意思 看起来很简单 根据您工作日的订单进行调整 如果您愿意 可以添加验证 但人们应该足够聪明 不需要对这
  • Django 创建自定义模型字段

    我正在尝试在 Django 中创建一个自定义字段 它将采用十进制货币值 例如 1 56 并将其作为整数 例如 156 保存在数据库中以存储货币值 这就是我到目前为止所拥有的 我已经设置了固定值来测试 class CurrencyField
  • 为什么考虑_all_requests_local 因 rspec 配置而失败

    rspec rails 2 7 0 导轨 3 0 10 邮政 Rails 3 1 错误捕获对我来说无关紧要 Code class ApplicationController lt ActionController Base unless R
  • Chrome 检查元素的奇怪问题

    When I load my page one of the images is higher than it is supposed to be When I right click Inspect element anywhere on
  • DatePicker 回发后消失

    我有一个与 jquery DatePicker 关联的 asp TextBox 此输入有一个更新文字控件的 onTextChangedEvent 所有这些代码都位于 UpdatePanel 内 因此文字控件会更改 但页面不会刷新 我面临的问
  • 最大样本

    如果我想对数字进行采样来创建向量 我会这样做 set seed 123 x lt sample 1 100 200 replace TRUE sum x 1 10228 如果我想采样 20 个总和为 100 的随机数 然后采样 30 个数字
  • Erlang 节点无法看到彼此

    我是 Erlang 新手 尝试在我的笔记本电脑上设置两个节点 在一个终端中我输入 eli elimayost erlang apps gt erl sname foo setcookie secret 在第二个终端中 eli elimayo
  • 由 gcc 检查的 printf() 包装参数

    当Cprintf 它的家族是由gcc and Wall在命令行上使用时 编译器会根据正在使用的格式字符串警告错误放置的参数 例如 下面的代码会收到一条错误消息 指出格式指定了 3 个参数 但实际上您只传递了两个 printf d d d 1
  • LLDB 在启动时似乎没有读取我的 .lldbinit 文件

    我有一个带有单个别名的文件 lldbinit command alias pi print int 但是当我从 Xcode 运行我的应用程序时 别名不起作用 但是 如果我手动输入别名 则别名确实有效 lldb pi 6 error pi i
  • 在嵌套字典 python 中搜索值

    搜索一个值并获取父字典名称 键 Dictionary dict1 part1 wbxml application vnd wap wbxml rl application resource lists xml part2 wsdl appl
  • Jenkins Kubernetes 插件无法配置 jnlp-slave pod

    我在 Ubuntu 17 04 VM 上运行 Kubernetes 1 10 0 Docker 17 03 2 ce 和 Jenkins 2 107 1 并在 Jenkins 中安装了 Kubernetes Plugin 1 5 我有另外
  • load() 函数如何允许用户提供回调?

    在 javascript 中 库 框架非常流行让我们定义用于数据后处理的回调函数 eg load 5 function element alert element name 我想知道 load 函数如何能够让用户提供回调 有这方面好的教程吗
  • 如何在 jupyter 笔记本上单独冻结单元及其输出

    使用 Jupyter 笔记本时 执行单元的输出 包括错误消息 可能很有用 所以我想freeze细胞本身及其输出 或者换句话说 失活单元以保持输出 这可行吗 这会冻结单元格 但不会冻结输出 在编辑器中打开笔记本 查找您要锁定的单元格 将以下行
  • 从字符向量创建函数列表

    提前致谢 如果这个问题之前已经得到回答 我很抱歉 我已经进行了相当广泛的研究 我有一个数据集 其中包含一行串联信息 特别是 名称 颜色代码 一些函数表达式 例如 一个值可能是 成本 FF0033 log x 6 我拥有提取信息的所有代码 最
  • 如何反转 Django 模板中的 for 循环,然后对结果进行切片

    在 Django 模板中 我迭代一组照片 并一张一张地显示它们 具体来说 现在我只有一张照片集 包含 6 个物体 我像这样显示这 6 个对象 for pic in picstream photo set all reversed img s
  • 如何在具有动态键值对的javascript中解析json? [复制]

    这个问题在这里已经有答案了 我想在 JavaScript 中解析 JSON 字符串 响应是这样的 var response 1 10 2 10 如何从这个 json 中获取每个键和值 我正在这样做 var obj parseJSON res
  • 在 php 中取消设置变量

    我刚刚通过 php 手册阅读了有关 unset 变量的内容 php手册说 unset 销毁指定的变量 这个 def 看起来很完美 直到我遇到静态变量 如果在函数内部 unset 静态变量 则 unset 仅在函数其余部分的上下文中销毁该变量