變量相關
PHP變量的內部實現
編程語言的系統類型分為強類型和弱類型兩種:
-
強類型語言是一旦某個變量被申明為某個類型的變量,在程序運行過程中,就不能將該變量的類型以外的值賦予給它,c/c++/java等語言就屬于這類
-
php及ruby,javascript等腳本語言就屬于弱類型語言:一個變量可以表示任意的數據類型
php變量類型及存儲結構
php在聲明或使用變量的時候,并不需要顯式指明其數據類型
php是弱類型語言,這不并表示php沒有類型,在php中,存在8種變量類型,可以分為三類:
-
標量類型:boolean,integer,float,string
-
復合類型:array,object
-
特殊類型:resource,NULL
變量存儲結構
變量的值存儲到一下所示的zval結構體中.其結構如下:
1
2
3
4
5
6
7
8
|
typedef struct _zval_struct zval; struct _zval_struct { zvalue_value value; // 存儲變量的值 zend_uint refcount__gc; // 表示引用計數 zend_uchar type; // 變量具體的類型 zend_uchar is_ref_gc; // 表示是否為引用 }; |
變量的值存儲在另外一個結構體zvalue_value中
變量類型
zval結構體的type字段就是實現弱類型最關鍵的字段了,type的值可以為:IS_NULL, IS_BOOL, IS_LONG, IS_DOUBLE, IS_STRING, IS_ARRAY, IS_OBJECT, IS_RESOURCE之一.從字面上就很好理解,他們只是類型的唯一標示,根據類型的不同將不同的值存儲到value字段
變量值的存儲
前面說到變量的值存儲在zvalue_value結構體中,結構體定義如下:
1
2
3
4
5
6
7
8
9
10
|
typedef union _zvalue_value { long lval; double dval; struct { char *val; int len; } str; HashTable *ht; zend_object_value obj; } _zvalue_value; |
日期相關
計算兩個日期之間的天數
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
<?php /** * 求兩個日期之間相差的天數(針對1970年1月1日之后,求之前可以采用泰勒公式) * @param string $day1 * @param string $day2 * @return number */ function diffBetweenTwoDays ( $day1 , $day2 ) { $second1 = strtotime ( $day1 ); $second2 = strtotime ( $day2 ); if ( $second1 < $second2 ) { $tmp = $second2 ; $second2 = $second1 ; $second1 = $tmp ; } return ( $second1 - $second2 ) / 86400; } $day1 = "2013-07-27" ; $day2 = "2013-08-04" ; $diff = diffBetweenTwoDays( $day1 , $day2 ); echo $diff . "\n" ; |