程式語言的類型系統分為強類型與弱類型兩大陣營。強類型語言(如 C/C++、Java)要求變量聲明後類型固定,運行期不可更改;而 PHP、Ruby、JavaScript 等腳本語言屬於弱類型,變量可動態承載任意數據類型。
雖然 PHP 是弱類型,但內部仍定義了完整的類型系統,共 8 種類型歸為三類:
PHP 內核使用 zval 結構體存儲變量值,其核心字段如下:
typedef struct _zval_struct zval;
struct _zval_struct {
zvalue_value value; // 變量實際值
zend_uint refcount__gc; // 引用計數
zend_uchar type; // 類型標識
zend_uchar is_ref_gc; // 是否為引用
};
type 字段是實現弱類型的關鍵,取值包括 IS_NULL、IS_BOOL、IS_LONG、IS_DOUBLE、IS_STRING、IS_ARRAY、IS_OBJECT、IS_RESOURCE。根據類型不同,值存儲於聯合體 zvalue_value 中:
typedef union _zvalue_value {
long lval; // 整數、布爾
double dval; // 浮點數
struct { // 字符串
char *val;
int len;
} str;
HashTable *ht; // 數組
zend_object_value obj; // 對象
} _zvalue_value;
利用 strtotime 將日期字符串轉為時間戳,再以 86400 秒(一天)為單位換算:
<?php
/**
* 計算兩個日期之間的天數差(適用於 1970-01-01 之後)
* @param string $day1 日期一
* @param string $day2 日期二
* @return float 天數差
*/
function diffBetweenTwoDays($day1, $day2) {
$second1 = strtotime($day1);
$second2 = strtotime($day2);
// 確保 $second1 為較大值
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"; // 輸出 8
?>
注意:此方法依賴時間戳,僅適用於 1970 年之後的日期;更早日期可考慮泰勒公式或 DateTime 類。