我們已經知道php變數在核心中其實是通過zval結構來實現的,也初步了如果設定乙個zval結構的型別和值,這一節我們的目的便是在前兩節的基礎上,徹底掌握對zval結構的操控,其間將引入很多超棒的新的巨集。
在code的時候,我們很希望在核心中建立的zval可以讓使用者在php語言裡以變數的形式使用,為了實現這個功能,我們首先要建立乙個zval。最容易想到的辦法便是建立乙個zval指標,然後申請一塊記憶體並讓指標指向它。如果你腦海裡浮現出了malloc(sizeof(zval))的影子,那麼請你立即剎車,不要用malloc來做這件事情,核心給我們提供了相應的巨集來處理這件事,理由和以前一樣:為了**漂亮並保持版本公升級時的相容性。這個巨集的是:make_std_zval(pzv)。這個巨集會用核心的方式來申請一塊記憶體並將其位址付給pzv,並初始化它的refcount和is_ref連個屬性,更棒的是,它不但會自動的處理記憶體不足問題,還會在記憶體中選個最優的位置來申請。
除了make_std_zval()巨集函式,alloc_init_zval()巨集函式也是用來幹這件事的,唯一的不同便是它會將pzv所指的zval的型別設定為is_null;
申請完空間後,我們便可以給這個zval賦值了。基於咱已經介紹的巨集,也許我們需要z_type_p(p) = is_null來設定其是null型別,並過z_someval形式的巨集來為它賦值,但是現在你有了更好更短的選擇!
核心中提供一些巨集來簡化我們的操作,可以只用一步便設定好zval的型別和值。
新巨集其它巨集的實現方法
zval_null(pvz); (注意這個z和val之間沒有下劃線!)
z_type_p(pzv) = is_null;(is_null型不用賦值,因為這個型別只有乙個值就是null,^_^)
zval_bool(pzv, b); (將pzv所指的zval設定為is_bool型別,值是b)
z_type_p(pzv) = is_bool; z_bval_p(pzv) = b ? 1 : 0;
zval_true(pzv); (將pzv所指的zval設定為is_bool型別,值是true)
zval_bool(pzv, 1);
zval_false(pzv); (將pzv所指的zval設定為is_bool型別,值是false)
zval_bool(pzv, 0);
zval_long(pzv, l); (將pzv所指的zval設定為is_long型別,值是l)
z_type_p(pzv) = is_long; z_lval_p(pzv) = l;
zval_double(pzv, d); (將pzv所指的zval設定為is_double型別,值是d)
z_type_p(pzv) = is_double; z_dval_p(pzv) = d;
zval_stringl(pzv,str,len,dup);(下面單獨解釋)
z_type_p(pzv) = is_string; z_strlen_p(pzv) = len; if (dup) else
zval_string(pzv, str, dup);
zval _stringl(pzv, str,strlen(str), dup);
zval_resource(pzv, res);
z_type_p(pzv) = is_resource; z_resval_p(pzv) = res;
先闡述一下zval_stringl(pzv,str,len,dup); str和len兩個引數很好理解,因為我們知道核心中儲存了字串的位址和它的長度,後面的dup的意思其實很簡單,它指明了該字串是否需要被複製。值為 1 將先申請一塊新記憶體並賦值該字串,然後把新記憶體的位址複製給pzv,為 0 時則是直接把str的位址賦值給zval。《撫琴居》上的一篇文章說這項特性將會在你僅僅需要建立乙個變數並將其指向乙個已經由 zend 內部資料記憶體時變得很有用。
如果你想在某一位置擷取該字串或已經知道了這個字串的長度,那麼可以使用巨集 zval_stringl(zval, string, length, duplicate) ,它顯示的指定字串長度,而不是使用strlen()。這個巨集該字串長度作為引數。但它是二進位制安全的,而且速度也比zval_string快,因為少了個strlen。
上一節中我們說過php中的資源型別的值其實就是乙個整數,所以zval_resource和zval_long的工作差不多,只不過它會把zval的型別設定為 is_resource.
TensorFlow建立變數
一 使用tf.variable函式建立變數 tf.variable initial value none,trainable true,collections none,validate shape true,caching device none,name none,variable def no...
JS變數的建立機制
var a function b 那麼它們具體儲存在 又是怎麼執行的呢?這次,就聊一聊 js 的堆疊記憶體和變數的建立機制。這裡只介紹 es5 的機制 在了解變數建立機制之前,先來了解一下變數的儲存空間。儲存空間分為棧記憶體和堆記憶體。棧記憶體 作用域 提供乙個供 js 自上而下執行的環境 都是在棧...
python怎樣建立變數 Python變數的建立
python 是一種動態型別語言,因此變數不需要顯式地宣告其資料型別。在python 中,所有的資料都被抽象為 物件 變數通過賦值語句來指向物件,變數賦值的過程就是將變數與物件關聯起來的過程。當變數被重新賦值時,不是修改物件的值,而是建立乙個新的物件並用變數與它關聯起來。因此,python 中的變數...