php 结构体_php基础知识集合
微信公眾號: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;
總結
以上是生活随笔為你收集整理的php 结构体_php基础知识集合的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 戴尔回应“供应链将撤离中国”等传闻:均系
- 下一篇: python echo函数_python