2014-09-05
首先说下静态变量和全局变量的区别,全局变量可以被所有函数访问,如果多个独立的函数使用了同名的变量,就会导致冲突,在只有一个函数需要访问某个变量时,我们应该优先使用静态变量,而不是全局变量
类中的静态成员,它属于整个类而不是属于类的某个实例,静态成员只保留一个变量值,而这个变量值对所有的实例都是有效的,所有的实例共享这个成员。
$this表示类的当前实例,Self::表示的是类本身 在类之外的代码不能使用这个操作符,而且它也不能识别自己在继承树层次结构中的位置。也就是说在扩展类中使用self作用域时,self可以调用基类中声明的方法,但他调用的总是已经在扩展类中重写的方法。基类方法被重写,但是如果要调用基类的方法,需要用到parent关键字。
静态成员也可以只属于父类,父子类中都定义了某个成员,需要使用parent来访问父类中的静态成员。这种情况下父子类中保存的静态成员值不同。
使用静态方式调用类中的方法,可以省略实例化类的代码,并且还会更高效(省去实例化类时需要消耗的一小部分资源)
词法语法分析流程
1 在文件Zend/zend_compile.c里,词法分析之后加上两行代码,用来打印出具体的词法分析出来的分词
retval = lex_scan(&zendlval->u.constant TSRMLS_CC); //原先的词法分析脚本
if(zendlval->u.constant.value.lval && zendlval->u.constant.value.lval< 10000)
printf("word: %ld/n", zendlval->u.constant.value.lval);
else if(zendlval->u.constant.value.str.val)
printf("word: %s/n", zendlval->u.constant.value.str.val);
2在词法分析zend_language_scanner.c中打印出词法链接的case条件,方便后续跟踪
printf("word-line:%d/n", yy_act);
switch ( yy_act )
3 在语法分析zend_language_parser.c中打印出语法链接的case条件,方便后续跟踪
YY_REDUCE_PRINT(yyn);
printf("grammar-line: %d/n", yyn);
switch(yyn)
4 构造包含static的类文件
<?php
class classname{
public static $valname = 'test';
public $val = 'test1';
function functionname(){
echo self::$valname;
}
}
$obj = new classname();
echo $obj->functionname();
5 重要片段分析
word: classname
grammar-line: 93
grammar-line: 86
走了zend_do_begin_class_declaration
初始化类的信息
并且把类注册进入了CG(class_table)
将当前类设置为CG(active_class_entry)
最后取出了下个操作码进行了设置
grammar-line: 98
grammar-line: 168
public
grammar-line: 183
grammar-line: 181
word: static
grammar-line: 186
Z_LVAL((yyval).u.constant)= ZEND_ACC_STATIC;
grammar-line: 182
走了这个函数zend_do_verify_access_types
做了检测,static不能用来限制abstract类的成员变量等
word: valname
grammar-line: 177
grammar-line: 169
word: test
grammar-line: 303
grammar-line: 309
grammar-line: 192
调用了zend_do_declare_property函数
通过CG(active_class_entry)检测,接口不能添加成员变量
变量不能是abstact和final
检查是否进行了重复定义
调用zend_declare_property_ex
通过access_type& ZEND_ACC_STATIC这个判断出来是否为静态变量
如果是静态变量则target_symbol_table= &ce->default_static_members;
如果不是则target_symbol_table= &ce->default_properties;
最后zend_hash_update更新属性字段
6 结论
类的普通变量和成员变量都存储在类结构的属性里面,仅是存储在的目标hash表不同
摘自 xiaoq3406的专栏
1
CI框架连接数据库配置操作以及多数据库操作
09-05
2
asp 简单读取数据表并列出来 ASP如何快速从数据库读取大量数据
05-17
3
C语言关键字及其解释介绍 C语言32个关键字详解
04-05
4
C语言中sizeof是什么意思 c语言里sizeof怎样用法详解
04-26
5
PHP中的魔术方法 :__construct, __destruct , __call, __callStatic,__get, __set, __isset, __unset , __sleep,
09-05
6
将视频设置为Android手机开机动画的教程
12-11
7
PHP中的(++i)前缀自增 和 (i++)后缀自增
09-05
8
最简单的asp登陆界面代码 asp登陆界面源代码详细介绍
04-12
常用dos命令及语法
2014-09-27
PHP中include和require区别之我见
2014-09-05
如何安装PHPstorm并配置方法教程 phpstorm安装后要进行哪些配置
2017-05-03
php递归返回值的问题
2014-09-05
单片机编程好学吗?单片机初学者怎样看懂代码
2022-03-21
PHP 教程之如何使用BLOB存取图片信息实例
2014-09-05
学ug编程如何快速入门?
2022-03-17
PHP数组函数array
2014-09-05
学习使用C语言/C++编程的7个步骤!超赞~
2022-03-20
零基础的初学者怎样学习java,或者应该先学什么?
2022-03-21
收割者剑客传奇免谷歌汉化版下载v2.0.1 安卓版
其它手游 40.19MB
下载
reaper收割者破解版下载v2.0.1 安卓完美版
其它手游 40.19MB
下载
reaper汉化版下载v2.0.1 安卓中文版
其它手游 40.19MB
下载
死神苍白剑士的传说中文版(Reaper)下载v2.0.1 安卓版
其它手游 40.19MB
下载
宝宝巴士迷宫小镇下载v9.89.99.01 官方安卓版
其它手游 113.4MB
下载
宝宝迷宫大作战游戏下载v9.89.99.01 安卓版
其它手游 113.4MB
下载
宝宝巴士干净的妙妙游戏下载v9.89.99.00 安卓版
其它手游 76.43MB
下载
妙妙爱干净宝宝巴士下载v9.89.99.00 安卓版
其它手游 76.43MB
下载翻炒厨师游戏下载v2.1.3 安卓版
下载
维塔战士游戏最新版下载v976 安卓版
下载
泡泡小镇城堡游戏下载v1.1.5 安卓完整版
下载
3d蚊子模拟器游戏最新版下载v2023.08.22 安卓版
下载
超级机器人英雄游戏下载v1.1.3 安卓版
下载
robot super游戏下载v1.1.3 安卓版
下载
zombie tsunami游戏下载v4.6.8 安卓版
下载
2026僵尸尖叫正版下载v4.6.8 安卓官方版
下载