php基础知识集合
未十一

源码

PHP 独特的语法混合了 C、Java、Perl 以及 PHP 自创新的语法

编译器

编译器就是将“一种语言(通常为高级语言)”翻译为“另一种语言(通常为低级语言)”的程序
一个现代编译器的主要工作流程:
源代码 (source code) → 预处理器 (preprocessor) → 编译器 (compiler) → 目标代码 (object code) → 链接器 (Linker) → 可执行程序 

非引用变量和引用变量

引用变量按址运算
function test()
{
    $a="1";
    $b =&$a;
    $b="2";
    echo $a;
}

存储变量原理

首先,php的解析引擎是Zend引擎,。在zend引擎中是使用zval结构来存储php变量的,zend是用c写的,所以代码中的结构定义也是c的语言结构,zval中包含有四个属性,分别是value,type,refcount,is_ref。
value:知道一个union指针,用于存储变量的值,支持的类型有
1)long:整型,不区别长短,统一为long,取值范围是由编译器位数来决定),double,str
2)double:浮点数,也是不区分float或者double,只有一种
3)结构体str:php在存储字符串时,将字符串的内容和长度都存了起来,这是为了避免重复计算字符串的长度。php中的函数strlen,就是直接返回了这个长度。
4)hashTable:用于存放数组,课件php的数组效率是极快的,O(1),后面再介绍一下zend中hashtable的实现吧
5)obj:用于存放对象,我们看一下zend_object_value的定义,实际是一个handle(对象的唯一id)跟handles(存了对象里各种方法的指针的虚函数表)

type:type值是用来判断value中的值,对应的,如下表:

然后,你会发现php的资源居然是存的long类型,那是因为,这个long存的是一个指针,内部数组的index或者是其他结构的资源,可以将其视为handle。

refcount:引用计数,为了减少 内存池的开销和垃圾回收,加入了该字段,这样在下一次用到同一个值的时候就会直接引用该值,然后refcount++就好,当你unset掉某个变量是也是会相应refcount--,直到为0时则会回收把它干掉

is_ref:是否为引用,1为引用,0为否。php中可以分为两种变量,引用和非引用,非引用就是正常的赋值,但是引用的话是传递地址,需要在前面加上“&”,相当于指针,改变引用的值是会改变原来改地址的变量的值的。

Zend Engine

zend engine的出现使得php有了质的提高:
1、把边解释边运行的方式变为先进行预编译(compile),再执行(execute)的方式极大提高了php的运行效率。
2、使得执行效率大幅提高
3、由于实行功能分离,降低了模块间的耦合度,扩展性大大加强
Zend Engine 最主要的特性就是把 PHP 的边解释边执行的运行方式改为先进行预编译(Compile),然后再执行(Execute)。这两者的分开给 PHP 带来了革命性的变化:执行效率大幅提高;由于实行了功能分离,降低了模块间耦合度,可扩展性也大大增强。此时 PHP 已经能很方便的应付各种各样的 BT 需求了,而伴随 PHP 4.4.x ―可能是 PHP4 系列的最后一个分支―的发布,PHP 的大部分开发人员已经将注意力放在了 PHP5 或者 PHP6 上面,以后发布的基本上就是一些 Bug Fix Release。可以说第一代的 Zend Engine 是已经在站最后一班岗了

函数&方法

函数是面向过程编程的一个算法
方法是面向对象编程的一个业务逻辑
p.s. PHP不像Java那样纯粹的面向对象编程,他在支持面向对象的同时,保留了面向过程的编程方式,所以在PHP的项目里面,通常既有函数,又有类;

短连接 & 长连接

短连接:比如http;
长连接:比如websocket;

发布于 2018-12-23 09:49:58

{{ comment.username }}

{{ comment.created_format }}

{{ reply.username }}

回复

{{ reply.to_username }}:

{{ reply.created_format }}