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
PHP中的(++i)前缀自增 和 (i++)后缀自增
09-05
7
最简单的asp登陆界面代码 asp登陆界面源代码详细介绍
04-12
8
常用dos命令及语法
09-27
PHP中include和require区别之我见
2014-09-05
将视频设置为Android手机开机动画的教程
2014-12-11
php递归返回值的问题
2014-09-05
如何安装PHPstorm并配置方法教程 phpstorm安装后要进行哪些配置
2017-05-03
PHP 教程之如何使用BLOB存取图片信息实例
2014-09-05
java中的info是什么意思
2022-03-24
单片机编程好学吗?单片机初学者怎样看懂代码
2022-03-21
学ug编程如何快速入门?
2022-03-17
PHP数组函数array
2014-09-05
IcePHP框架中的快速后台中的通用CRUD功能框架
2014-09-05
真实枪械武器模拟器游戏下载v2.177 安卓版
射击枪战 194.6M
下载果汁四溅2中文版下载v1.9.8 安卓版
休闲益智 81.7M
下载我飞刀玩得贼6手游下载v2.2.7 安卓版
休闲益智 73.9M
下载方块冒险下载v1.1.9 安卓版
休闲益智 19.7M
下载我是鸽手游戏下载v2.0.0 安卓版
休闲益智 41.3M
下载耶小兔子2最新中文版下载v1.2.9 安卓版
休闲益智 60.9M
下载弓箭大师你就是王者游戏下载v2.0.1 安卓最新版
其它手游 164.4M
下载弓箭大师你就是王者官方版下载v2.0.1 安卓版
其它手游 164.4M
下载3d狙击王者手机游戏下载v1.5 安卓版
下载
足球冲鸭手机版下载v1.0.16.404.401.0116 安卓版
下载
有种来找我手游下载v1.4.8 安卓版
下载
忍者跳跳跳官方版下载v1.0.2 安卓版
下载
百战斗斗堂拇指游戏下载v5.8 安卓版
下载
梦幻斗斗堂手游下载v5.8 安卓版
下载
百战斗斗堂4399版下载v5.8 安卓版
下载
百战斗斗堂九游手游下载v5.8 安卓版
下载