当前位置: 首页 > 编程日记 > 正文

深入理解PHP原理之变量作用域

作者:laruence(http://www.laruence.com/)
地址: http://www.laruence.com/2008/08/26/463.html
                    
  
   PHP变量的内部表示是如何和用户脚本中的变量联系起来的呢?也就是说,如果我在脚本中写下:
<?php
   $var="laruence";
   
echo  $var;
?>

   ZE是如何把我的变量var和内部结构zval联系起来的呢?
   深入理解PHP原理之变量中讲过,PHP内部都是使用zval来表示变量的,但是对于上面的脚本,我们的变量是有名字的, var。而zval中并没有相应的字段来体现变量名。
    如果你想到了PHP内部一定有一个机制,来实现变量名到zval的映射。那么你真的是很聪明,;)
在PHP中,所有的变量都会存储在一个数组中(确切的说是hash table), 并且,PHP也是通过不同的数组来实现变量的作用域的。
    当你创建一个变量的时候,PHP会为这个变量分配一个zval,填入相应的变量值,然后将这个变量的名字,和指向这个zval的指针填入一个数组中。然后,当你获取这个变量的时候,PHP会通过查找这个数组,获得对应的zval。
   查看_zend_executor_globals结构(这个结构在PHP的执行器保存一些执行相关的上下文信息)
struct
_zend_executor_globals
{

....
HashTable*active_symbol_table;/*活动符号表*/
HashTable
symbol_table;     /*全局符号表*/
HashTable
included_files;   

jmp_buf*bailout;
interror_reporting;
.....
}

  其中,全局符号表,保存了在顶层作用域(就是不在任何函数,对象内)的变量。每当调用一个函数(对象的方法)的时候,就会为这个函数创建一个活动符号表,所有在这个函数内定义的变量,都会保存在这个活动符号表中。
  对,这就是PHP的变量作用域的实现方式! 举个列子:
<?php
    $var="I am in the global symbol table";
   
function  sample($para){
        $var="I am in the active symbol table";
        
echo$var;
     
}
     sample($var);
     
echo  $var;
  
?>

  在函数sample外面的变量$var,它会被填入全局符号表中,与他对应的有一个zval指针,这个zval保存了一个字符串”I am in the global symbol table”.
  函数内的$var, 它会被填入属于函数sample的活动符号表中,一样的,与他对应的zval中,保存着字符串”I am in the active symbol table“.

  比较特殊的,就是函数sample的参数$para了,这个$para是保存在sample的活动符号表的,但是与他对应的zval指针,会指向一个保存一份全局变量$var的copy的zval(严格来讲不是copy,是引用,这个涉及到变量的copy on write机制,我会在以后介绍)。
  我们都知道PHP对于简单变量是传值调用的,但是,我要告诉你的是,PHP并不是简单的通过复制一个zval来实现传值的,呵呵,留个悬念,等我下回分解.

相关文章:

Azure AI的又一里程碑,Neural TTS新模型呈现真人般情感饱满的AI语音

在人与人之间的对话中&#xff0c;即使是同样的字句&#xff0c;也会因为所处情景和情感的不同而表现出丰富的抑扬顿挫&#xff0c;而这种动态性恰恰是各种AI合成语音的“软肋”。相比于人类讲话时丰富多变的语气&#xff0c;AI语音的“心平气和”往往给人带来明显的违和感。 …

VS2010中“工具选项中的VC++目录编辑功能已被否决”解决方法

http://blog.csdn.net/chaijunkun/article/details/6658923 这是VS2010的改变&#xff0c;不能够在“工具-选项”中看到“VC目录”了。 但是呢&#xff0c;我们可以在另外一个地方找到它&#xff0c;请看下边的对比照片。 VS2008中&#xff1a; VS2010中&#xff1a; 打开方式非…

Bminer 7.0.0 ETH挖矿教程(Linux 64)

Bminer产品介绍Bminer是目前最快的挖矿程序&#xff0c;Bminer是基于NVIDIA GPU深度优化的挖矿软件。Bminer支持Equihash和Ethash两种算法的虚拟币&#xff0c;包括&#xff1a;ETH&#xff08;以太坊)&#xff0c;ETC&#xff0c;ZEC&#xff08;零币&#xff09;&#xff0c;…

深入理解PHP原理之变量分离/引用(Variables Separation)

引自: http://www.laruence.com/ [风雪之隅 ]在前面的文章中我已经介绍了PHP的变量的内部表示(深入理解PHP原理之变量(Variables inside PHP))&#xff0c;以及PHP中作用域的实现机制(深入理解PHP原理之变量作用域(Scope inside PHP))。这节我们就接着前面的文章&#xff0c;继…

C# 属性、索引

属性&#xff08;property&#xff09;: public string Name {get{return _name;}set{_name value;} } 简写为&#xff1a; public string Name { set; get;} 索引器&#xff08;index&#xff09;&#xff1a; 索引器为C#程序语言中泪的一种成员&#xff0c;它是的对象可…

分享几段祖传的 Python 代码,拿来直接使用!

作者 | 周萝卜来源 | 萝卜大杂烩今天分享几段工作生活中常用的代码&#xff0c;都是最为基础的功能和操作&#xff0c;而且大多还都是出现频率比较高的&#xff0c;很多都是可以拿来直接使用或者简单修改就可以放到自己的项目当中日期生成很多时候我们需要批量生成日期&#xf…

JVM——Java虚拟机架构

Java虚拟机&#xff08;Java virtualmachine&#xff09;实现了Java语言最重要的特征&#xff1a;即平台无关性。 平台无关性原理&#xff1a;编译后的 Java程序&#xff08;.class文件&#xff09;由 JVM执行。JVM屏蔽了与具体平台相关的信息&#xff0c;使程序可以在多种平台…

深入理解PHP之数组遍历

本文地址: http://www.laruence.com/2009/08/23/1065.html 经常会有人问我, PHP的数组, 如果用foreach来访问, 遍历的顺序是固定的么? 以什么顺序遍历呢? 比如: <?php$arr[laruence] huixinchen;$arr[yahoo] 2007;$arr[baidu] 2008;foreach ($arr as $key >…

Github 年度最受欢迎的 TOP30 Python 项目,超值

作者 | 俊欣来源 | 关于数据分析与可视化今天小编整理归纳了2021年Github上面最受欢迎的30个Python项目&#xff0c;帮助大家在打磨技术与提升自我上面更进一步。通过代码来获取Github官网有开源的接口&#xff0c;因此数据的获取也就方便了许多&#xff0c;代码如下url https…

Linux字符设备驱动程序的框架(新写法)

这是老版本内核的的Linux驱动注册函数写法&#xff1a; major register_chrdev(0, "hello", &hello_fops); /* (major, 0), (major, 1), ..., (major, 255)都对应hello_fops */ 新版本内核Linux驱动注册函数写法#define MAJOR(devid) ((unsigned int) ((devid…

将一个普通的java项目转化为maven项目

在学习Spring事务时&#xff0c;我参考的书的源码不是maven项目&#xff0c;整本书依赖的100多个jar包都在一个文件夹里&#xff0c;我本来对spring每个模块的学习源码都放在一个Github仓库里&#xff0c;每一个项目都是maven项目&#xff0c;这样想要将项目转化为maven项目&am…

深入理解PHP内存管理之谁动了我的内存

本文地址: http://www.laruence.com/2011/03/04/1894.html转载请注明出处首先让我们看一个问题: 如下代码的输出, var_dump(memory_get_usage());$a "laruence";var_dump(memory_get_usage());unset($a);var_dump(memory_get_usage()); 输出(在我的个人电脑上, 可能…

蓝懿教育九月二十七日记录

将VIew移动做成动画效果 这种动画效果没有中间的位移可以添加动画的View属性center&#xff0c;frame&#xff0c;alpha&#xff0c;transform , backgroundColor//继续做消失的动画[UIView animateWithDuration:1 animations:^{iv.alpha 0;} completion:^(BOOL finished) …

新年快到了,让我们一起用 Python 编织中国结吧

作者 | FrigidWinter来源 | CSDN博客新年快到了&#xff0c;今天博主教大家用Python编织中国结~中国结的组成部分中国结是一种手工编织工艺品&#xff0c;它身上所显示的情致与智慧正是汉族古老文明中的一个侧面。因为其外观对称精致&#xff0c;可以代表汉族悠久的历史&#x…

pwa+webpack,初探与踩坑

0.前言 我们都知道pwa是一个新技术.&#xff0c;依靠缓存&#xff0c;离线了还能正常跑&#xff0c;而且秒开。我把以前原生写的小游戏迁移到react&#xff0c;再迁移到webpackreact&#xff0c;最后再升级到pwa。具体介绍不多说&#xff0c;我们开始撸吧。 1.webpack webpack攻…

linux sar 命令详解

sar&#xff08;System Activity Reporter系统活动情况报告&#xff09;是目前 Linux 上最为全面的系统性能分析工具之一&#xff0c;可以从多方面对系统的活动进行报告&#xff0c;包括&#xff1a;文件的读写情况、系统调用的使用情况、磁盘I/O、CPU效率、内存使用状况、进程…

PHP底层工作原理

简介 先看看下面这个过程&#xff1a; 我们从未手动开启过PHP的相关进程&#xff0c;它是随着Apache的启动而运行的&#xff1b;PHP通过mod_php5.so模块和Apache相连&#xff08;具体说来是SAPI&#xff0c;即服务器应用程序编程接口&#xff09;&#xff1b;PHP总共有三个模…

使用 Pandas、Jinja 和 WeasyPrint,轻松创建一个 PDF 报表

作者 |周萝卜来源 |萝卜大杂烩我们都知道&#xff0c;Pandas 擅长处理大量数据并以多种文本和视觉表示形式对其进行总结&#xff0c;它支持将结构输出到 CSV、Excel、HTML、json 等。但是如果我们想将多条数据合并到一个文档中&#xff0c;就有些复杂了。例如&#xff0c;如果要…

通过Excel生成批量SQL语句

项目中有时会遇到这样的要求&#xff1a;用户给发过来一些数据&#xff0c;要我们直接给存放到数据库里面&#xff0c;有的是Insert&#xff0c;有的是Update等等&#xff0c;少量的数据我们可以采取最原始的办法&#xff0c;也就是在SQL里面用Insert into来实现&#xff0c;但…

抵御「黄貂鱼」攻击,谷歌使出禁用2G「大招」

整理 | 于轩 责编 | 张红月出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;你还在使用2G吗&#xff1f;相信很多人第一反应都是“怎么可能&#xff1f;”确实&#xff0c;现在绝大数人都在使用技术成熟的4G网络&#xff0c;以及更高网速的5G。但是你有注意到…

Crontab运行php脚本

首先&#xff0c;确认 PHP 可执行文件的位置 —— 对于大多数 Linux 系统&#xff0c;几乎肯定是 /usr/bin/php。如果不确定其位置&#xff0c;请在命令行中键入 which php 并查看响应内容。 其次&#xff0c;键入以下代码&#xff0c;确保将 /usr/bin/php 替换为 PHP 可执行文…

iOS原生如何加载HTML中img标签的图片

原文出自&#xff1a;iOS原生如何加载HTML中img标签的图片 前言 最近iOS App项目中使用Webview加载H5页面比较多&#xff0c;也有不少朋友经常问到这个问题&#xff0c;在这里我也学习学习如何通过iOS原生的方式来加载H5页面中的图片然后让webview显示图片。 相信有很多朋友也…

Python3 的urllib实例

在Python3中合并了 urllib 和 urllib2&#xff0c; 统一命名为 urllib 了&#xff0c;我觉得这样更加合理了。让我们可以像读取本地文件一样读取WEB上的数据。封装了一个类&#xff0c;供以后方便使用吧&#xff01;并附带有许多的应用实例。 一、封装的类 #!/usr/bin/env pyth…

Java中Filter、Servlet、Listener的学习

1、Filter的功能filter功能&#xff0c;它使用户可以改变一个 request和修改一个response. Filter 不是一个servlet,它不能产生一个response,它能够在一个request到达servlet之前预处理request,也可以在离开 servlet时处理response.换种说法,filter其实是一个”servlet chainin…

CentOS 6安装DHCP

#wget ftp://ftp.isc.org/isc/dhcp/dhcp-4.2.3/dhcp-4.2.3.tar.gz #tar xvzf dhcp-4.2.3.tar.gz# cd dhcp-4.2.3#./configure #make #make install

小米AI实验室六篇论文获ICASSP2022收录,多模态语音唤醒挑战赛夺冠

1月22日&#xff0c;全球语音、声学顶级会议ICASSP 2022公布了论文入选名单&#xff0c;小米AI实验室6篇学术论文被接收。小米“自由说”系统在MISP&#xff08;基于多模态信息的语音处理&#xff09;挑战赛中荣获多模态语音唤醒第一名和多模态语音识别第二名&#xff0c;并受邀…

React + Koa 实现服务端渲染(SSR)

⚛️React是目前前端社区最流行的UI库之一&#xff0c;它的基于组件化的开发方式极大地提升了前端开发体验&#xff0c;React通过拆分一个大的应用至一个个小的组件&#xff0c;来使得我们的代码更加的可被重用&#xff0c;以及获得更好的可维护性&#xff0c;等等还有其他很多…

11 款可替代 top 命令的工具!

‍‍作者 | JackTian来源 | 杰哥的IT之旅在 Linux 环境下 top 命令都不陌生&#xff0c;它以实时动态的方式查看系统的整体运行情况&#xff0c;综合了多方信息监测系统性能和运行信息的实用工具&#xff0c;通过 top 命令所提供的互动式界面&#xff0c;可以用热键来进行管理。…

几个重要的RFC

RFC目录 权威无须解释 http://www.ietf.org/rfc/RFC中文目录http://man.chinaunix.net/develop/rfc/default.htm几个常用的RFC参考&#xff1a; RFC1945 超文本传输协议--HTTP/1.0 RFC2616超文本传输协议--HTTP/1.1 对 RFC2068的补充RFC3920可扩展的消息和出席信息协议 (XMPP)…

iOS开发笔记-两种单例模式的写法

iOS开发笔记&#xff0d;两种单例模式的写法 单例模式是开发中最常用的写法之一&#xff0c;iOS的单例模式有两种官方写法&#xff0c;如下&#xff1a; 不使用GCD #import "ServiceManager.h"static ServiceManager *defaultManager;implementation ServiceManager(…