文章出處

常量

常量是相對于變量來說的:是一個其中存儲的數據不會也不應該改變的“標識符”。

常量的使用,就2個方面:定義,取值。

常量的定義

//常量定義語法1:
//define("常量名",  常量值);
define("PI",  3.14);
define("SCHOOL", "傳智播客");
//定義形式2:
//const  常量名  = 常量值;
const  CC1 = 1234;
const  CC2 = 'abcd';

常量的使用——取值

也有兩種形式:直接使用名字,或通過constant()函數取得其值;

//使用形式1:直接使用其名字
echo "<br />常量PI的值是:" . PI; //注意,不能寫在引號中
echo "<br />常量SCHOOL為:" . SCHOOL;
$s1 = PI * 3 * 3;   //求半徑為3的圓面積
//使用形式2:使用函數constant()獲得一個常量的值:
//形式: constant("常量名");//注意:常量名是一個字符串
$s2 = constant("PI") * 3 * 3;
echo "<br />s1= $s1, s2 = $s2";
echo "<br />" .  SCHOOL . constant("CC1") . constant("CC2");
//取得常量值的靈活性語法:
$i = 1;
$c1 = "CC" . $i;
echo "<br />常量 $c1 的值為:" . constant($c1);//輸出1234

常量變量的區別

  1. 定義形式不同:
  2. 使用形式不同:常量無需$符號
  3. 可變程度不同:常量的值不可以改變,常量也不可以銷毀
  4. 作用范圍不同:常量具有超全局作用域 (函數內外都可以直接使用)
  5. 可用類型不同:常量只能存儲標量類型(整數,浮點數,字符串,布爾)

判斷常量是否存在

  • 使用defined()函數:
    • 如果存在:返回結果是true,
    • 如果不存在:返回結果是false

使用一個未定義的常量:

先看2個對比代碼:

echo  “v1的值為”  .  $v1;  //注意,該變量v1未定義過
echoC1的值為”  .  C1;   //注意,該常量C1未定義過

注意:在php中,當使用一個未定義的常量的時候,系統會直接將該常量當做“有值”的常量去使用,并且其值就是該常量名——雖然也會報錯!

預定義常量

就是系統中預先定義好的一些常量,大約有幾百個,我們只要知道幾個就行:

  • M_PI: 就是圓周率的常量值;
  • PHP_OS: 就是php運行所在的操作系統
  • PHP_VERSION:就是php的版本號
  • PHP_INT_MAX: php中的最大的整數值
  • ......更多可參考:php手冊>附錄>保留字列表>預定義常量

魔術常量

其實只是常量的形式,但沒有常量的“恒常”的含義:其值其實會變化的,只有很少的幾個:

__FILE__  :代表當前網頁文件的完整物理路徑
__DIR__   :代表當前網頁文件所在的文件夾
__LINE__  :代表當前這個常量名所在的”行號”

數據類型

總體劃分

有8種數據類型:

基本類型(標量類型):

  • 整數類型: int, integer
  • 浮點數類型: float,double, real
  • 字符串類型: string
  • 布爾類型: bool, boolean 這種類型,只有2個數據:true,false

復合類型:

  • 數組: array
  • 對象: object

特殊類型

  • 空類型:null , 這種類型中,只有一個數據,那就是null
  • 資源類型:resource

整數類型

整數類型的4種寫法:

  • $n1 = 123; //10進制數字寫法
  • $n2 = 0123; //8進制數字寫法,實際n2中存儲的數字比123小
  • $n3 = 0x123; //16進制數字寫法,實際n3中存儲的數字比123大
  • $n4 = 0b1010; //2進制數字寫法(目前不學)

進制轉換問題

首先記住這幾個單詞:

bin:2進制

oct:8進制

dec:10進制

hex:16進制

進制轉換主要分2種情況:

  1. 10進制轉換為其他3種進制:decbin(), decoct(), dechex();
  2. 其他3種進制,轉換為10進制:

進制轉換的系統函數——必須會用

進制轉換主要分2種情況:

  1. 10進制轉換為其他3中進制:
  • decbin(一個10進制數字): 結果返回的是該數字的2進制數字形式的字符串!!!
  • decoct(一個10進制數字): 結果返回的是該數字的8進制數字形式的字符串!!!
  • dechex(一個10進制數字): 結果返回的是該數字的16進制數字形式的字符串!!!

  1. 其他3種進制,轉換為10進制:
  • bindec(一個2進制數字字符串): 結果返回的是該2進制數字字符串對應的10進制數字!!!
  • octdec(一個8進制數字字符串): 結果返回的是該8進制數字字符串對應的10進制數字!!!
  • hexdec(一個16進制數字字符串): 結果返回的是該16進制數字字符串對應的10進制數字!!!

對于輸入的字符串中的字符,如果不是對應進制的數字,會被忽略。

那么,有沒有這個轉換呢?hexbin()???? ——沒有!

浮點類型

浮點數的2種表示形式

  1. 常規寫法:帶小數點。

    $v1 = 123.456;
  2. 科學計數法:帶一個特殊符號“E”

    $v1 = 123.456E2;                  //含義為:123.456乘以10的2次方;
    $v2 = 123.456E3;                  //含義為:123.456乘以10的3次方,雖然結果是123456,但仍然是“浮點型”
    $v3 = 123E4;                           //含義為:123乘以10的4次方,還是浮點數。

點數使用的細節知識

1.浮點數不應進行大小比較

因為:

  1. 所有數字,最終的表示形式,都是2進制!!!
  2. 大多數浮點數的2進制形式,不能完全表達準確,最終只能“以很高的精度接近理論值”
  3. 因此,浮點數比較是不可靠。

再從另一個角度證明浮點數的不準確性:

說明: php中輸出其實是做了一定的處理之后的顯示結果,而js的輸出是該計算結果的“真實反映”。

  • 那應該怎么辦?

    考慮實際應用所需的精度的情況下,去將要比較的浮點數,轉換為整數之后再比較。

    比如:

    要求精度為3為小數,則都乘以1000,然后取整后比較;

    要求精度為4為小數,則都乘以10000,然后取整后比較;

    ....

2.當整數運算的結果超出整數的范圍后,會自動轉換為浮點數(了解)

獲取一個數據(變量)的類型的函數有:

  • getType($變量); 返回的是該類型的名字(字符串);
  • var_dump($變量): 會輸出該變量的類型,數據內容,(以及長度);

字符串

有如下4形式:

形式1:雙引號字符串:

$str1 = “字符串內容.....”;

形式2:單引號字符串:

$str2 = ‘字符串內容.....’;

形式3:雙引號定界符字符串:

$str3 = <<<”標識符A”
字符串內容....
標識符A;

形式4:單引號定界符字符串:

$str4 = <<<’標識符B’
字符串內容...
標識符B;

雙引號字符串

輸出內容為:

單引號字符串:

說明:

實際上,單引號字符串中,只有最后一個“”才是必須進行轉義的。

雙引號定界符字符串(heredoc)

結果為:

單引號定界符字符串(nowdoc)

結果為:

布爾類型

  • 單詞是bool,boolean。
  • 其只有2個數據:true,false;
  • 布爾類型的一個常見應用情形是:
    • 對一個變量直接進行判斷,比如if判斷,示例如下:



      這里的判斷,永遠是指:判斷該變量(數據)“是否為真”。

對于這種情況,只有如下數據是被當做“假”(false):

  • 0, 0.0, “”, “0”, null, array(), false, 還有一個是“未定義的變量”,
    其余都是真。

參考:
手冊》附錄》PHP類型比較表》


類型轉換

1. 自動轉換:

在任何運算中,如果需要某種類型的數據,而給出的數據不是該類型,通常都會發生自動轉換:將該類型轉換為目標需要的類型。

比如:

octdec($x), bindec($x),  hexdec($x);   //這里就要求$x必須是字符串,如果不是,就會轉換;
$v1 = 1 + “2;                //此時也發生了自動轉換。


2.強制轉換:

自動類型轉換是由“運算符”或類似運算符的語句來決定的。

而:

強制類型轉換,僅僅是一個簡單的語法:

  • 形式:(目標類型)數據;
  • 含義: 將該數據轉換為設定的目標類型;

例子:


通常的轉換目標類型有:

(int), (float), (string), (bool), (array), (object)

上述強制類型轉換,并不改變該變量的本身數據或類型。

對應,有一個語法是直接改變改變本的數據(及類型):

settype( $變量名,  “目標類型”);


3.類型相關的函數

  • var_dump():用于輸出變量的“完整信息”,幾乎只用于調試代碼。
  • getType($變量名):獲取該變量的類型名字,返回的是一個表示該類型名字的字符串,比如:“string”,“bool”,“double”,“int”
  • setType($變量名,“目標類型”):將該變量強制改變為目標類型;
  • isset(), empty(), unset();。。。。省略!
  • is_XX類型() 系列函數:判斷某個數據是否為某種類型,有如下一些:
    • is_int($x); 判斷$x是否是一個整數類型;
    • is_float($x);
    • is_string($x);
    • is_bool($x);
    • is_array($x);
    • is_object($x);
    • is_null($x);
    • is_numeric($x); 判斷$x是否是一個數字!
    • is_scalar($x); 判斷$x是否是一個“標量類型”

文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()