PHP學(xué)習(xí)2

PHP支持8種基本的數(shù)據(jù)類型

四種標量類型:
+boolean(布爾型)
+nteger(整型)
+float(浮點型鼻忠,也叫double)
+string(字符串)

兩種復(fù)合類型:
+array(數(shù)組)
+object(對象)

最后是兩種特殊類型:
+resource(資源)
+NULL(NULL)

為了確保代碼的易讀性, 本手冊還介紹了一些偽類型:
+mixed
+number
+callback
以及偽變量$......
可能還會讀到一些關(guān)于“雙精度(double)”類型的參考励翼。實際上double和float是相同的,由于一些歷史的原因颗品,這兩個名稱同時存在手形。
變量的類型通常不是由程序猿設(shè)定的,確切的說掐隐,是由PHP根據(jù)該變量使用的上下文在運行時決定的。

note:如果想查看某個表達式的值和類型,用var_dump()虑省。
如果只是想得到一個易讀懂的類型的表達方式用于調(diào)試匿刮,用gettype()。要查看某個類型探颈,不要用 gettype()熟丸,而用is_type函數(shù)。以下是一些范例:
<?php
$a_bool = TRUE;
$a_str = "foo";
$a_str2 = "foo";
$an_int = 12;

echo gettype($a_bool); //prints out: boolean
echo gettype($a_str);  //prints out: string

// If this is an integer, increment it by four
if (is_int($an_int)){
  $an_int += 4;
}
// If $bool is a string, print it out
// (does not print out anything)
if (is_string($a_bool)){
    echo "String: $a_bool";
}
?>

如果要將一個變量強制轉(zhuǎn)換為某類型伪节,可以對其使用強制轉(zhuǎn)換或者settype()函數(shù)光羞。

PHP 布爾類型

這是最簡單的類型。boolean表達了真值怀大,可以為TRUE或FALSE纱兑。

NOTE:布爾類型是 PHP 4 引進的。

語法

要指定一個布爾值化借,使用關(guān)鍵字TRUE或FALSE潜慎。兩個都不區(qū)分大小寫。

<?php
   $foo = True;
?>
通常你用某些運算符返回boolean值蓖康,并將其傳遞給控制流程铐炫。
<?php
    // = 是一個操作符,它檢測兩個變量是否相等蒜焊,并返回一個布爾值
    if($action = "show_version"){
      echo "The version is 1.23";
}
  //這樣做是不必要的...
    if($show_separators == TRUE){
      echo "<hr>";
  }
//...因為可以使用下面這種簡單的方式:
if($show_separators){
  echo "<hr>";
}
?>

轉(zhuǎn)換為布爾值

要明確的將一個值轉(zhuǎn)換成boolean倒信,用(bool)或者(boolean)來強制轉(zhuǎn)換。但是很多情況下不需要用強制轉(zhuǎn)換泳梆,因為當(dāng)運算符鳖悠,函數(shù)或者流程控制結(jié)構(gòu)需要一個boolean參數(shù)時,該值會被自動轉(zhuǎn)換优妙。

當(dāng)轉(zhuǎn)換為boolean時竞穷,以下值被認為是FALSE:
+the布爾值FALSE自身
+the整型值0(零)
+the浮點型值0.0(零)
+空字符串,以及字符串"0"
+不包括任何元素的數(shù)組
+不包括任何成員變量的對象(僅PHP4.0適用)
+特殊類型NULL(包括尚未設(shè)定的變量)
+從沒有任何標記(tags)的XML文檔生成的SimpleXML對象
所有其他值都被認為是TRUE(包括任何資源)鳞溉。

Warning

-1和其他非零值(不論正負)一樣,被認為是TRUE鼠哥!

PHP整型

語法

整型值可以使用十進制熟菲,十六進制或八進制表示,前面可以加上可選的符號(-或者+)朴恳。
八進制表示數(shù)字前必須加上0(零)抄罕,十六進制表示數(shù)字前必須加上0x。

Example #1 整數(shù)文字表達

<?php
$a = 1234; //十進制數(shù)
$a = -123; //負數(shù)
$a = 0123; //八進制數(shù)
$a = 0x1A; //十六進制數(shù)
?>

整數(shù)溢出

如果給定的一個數(shù)超出了integer的范圍于颖,將會解釋為float呆贿。同樣如果執(zhí)行的運算結(jié)果超出了integer范圍,也會返回float。

<?php
    $large_number = 2147483647;
     var_dump($large_number);
     //輸出為:int(2147483647)

     $large_number = 2147483648;
     var_dump($large_number);
     //輸出為:float(2147483648)

    //同樣也適用于十六進制表示的整數(shù):從 2^31 到 2^32-1:
    var_dump(0xffffffff);
    //輸出float(4294967295)

     //不適用于大于2^32-1 的十六進制表示的數(shù):
     var_dump(0x100000000);
     //輸出:int(2147483647)

      $million = 1000000;
      $large_number =  50000 * $million;
      var_dump($large_number);
      // 輸出: float(50000000000)
?>

轉(zhuǎn)換為整型

要明確的將一個值轉(zhuǎn)換為integer做入,用(int)或(integer)強制轉(zhuǎn)換冒晰。不過大多數(shù)情況下都不需要強制轉(zhuǎn)換,因為當(dāng)運算符竟块,函數(shù)或流程控制需要一個integer參數(shù)時壶运,值會自動轉(zhuǎn)換。還可以通過函數(shù)intval()來將一個值轉(zhuǎn)換成整型浪秘。

從布爾值轉(zhuǎn)換

FALSE將產(chǎn)生出0(零)蒋情, TRUE將產(chǎn)生出1(一)

從浮點數(shù)轉(zhuǎn)換

當(dāng)從浮點數(shù)轉(zhuǎn)換成整數(shù)時,將向零取整耸携。

如果浮點數(shù)超出了整數(shù)范圍(通常為 +/- 2.15e+9 = 2^31)棵癣,則結(jié)果不確定,因為沒有足夠的精度使浮點數(shù)給出一個確切的整數(shù)結(jié)果夺衍。在此情況下沒有警告狈谊,甚至沒有任何通知!

Warning

決不要將未知的分數(shù)強制轉(zhuǎn)換為integer刷后,這樣有時會導(dǎo)致不可預(yù)料的結(jié)果的畴。

PHP浮點型

浮點數(shù)(也叫浮點數(shù),雙精度或?qū)崝?shù))可以用以下任一語法定義:

<?php
    $a = 1.234;
    $a = 1.2e3;
    $c = 7E-10;
?>

PHP字符串

語法

一個字符串通過下面的4種方法來定義:
+單引號
+雙引號
+heredoc語法結(jié)構(gòu)
+nowdoc語法結(jié)構(gòu)(自PHP5.3.0以后)

單引號

定義一個字符串的最簡單的方法是用單引號把它包圍起來(標點符號 ')尝胆。
如果想要輸出一個單引號丧裁,需在它的前面加個反斜線()。在單引號前或在字符串的結(jié)尾處想要輸出反斜線含衔,輸入兩條()煎娇。注意,如果在任何其他的字符前加了反斜線贪染,反斜線將會被直接輸出缓呛。

Note: 不像雙引號和heredoc語法結(jié)構(gòu), 在單引號字符串中的變量和特殊含義的字符將不會被替換杭隙。

雙引號

如果字符串是包圍在雙引號(")中哟绊,PHP將對一些特殊的字符進行解析

Heredoc結(jié)構(gòu)

第三種定義字符串的方法是用heredoc句法結(jié)構(gòu):<<<。在該提示符后面痰憎,要定義個標識符票髓,然后是一個新行。接下來是字符串本身铣耘,最后要用前面定義的標識符作為結(jié)束標志洽沟。
結(jié)束時所引用的標識符必須在一行的開始位置,而且蜗细,標識符的命名也要像其他標簽一樣遵守PHP的規(guī)則:只能包含字母裆操、數(shù)字和下劃線,并且不能用數(shù)字和下劃線作為開頭。

Warning

要注意的是結(jié)束標識符這行除了可能有一個分號(;)外踪区,絕對不能包括其他字符昆烁。這意味著標識符不能縮進,分號的前后也不能有任何空白或tabs朽缴。更重要的是結(jié)束標識符的前面必須是個被本地操作系統(tǒng)認可的新行標簽善玫。
如果不遵守該規(guī)則導(dǎo)致結(jié)束標簽不“干凈”,PHP將認為它不是結(jié)束標識符而繼續(xù)尋找密强。如果在文件結(jié)束前也沒有找到一個正確的結(jié)束標識符茅郎,PHP將會在最后一行產(chǎn)生一個句法錯誤。
Heredocs結(jié)構(gòu)不能用來初始化class或渤,而從PHP5.3以后系冗,則該限制只能用在包含變量的情況下。

Example #1 非法的示例

<?php
class foo {   
 public $bar = <<<EOT
bar
EOT;
}
?>

Heredoc結(jié)構(gòu)就象是沒有使用雙引號的雙引號字符串薪鹦, 這就是說在heredoc結(jié)構(gòu)中引號不用被替換掌敬,但是上文中列出的字符 (等)也可使用。 變量將被替換池磁,但在heredoc結(jié)構(gòu)中字符串表達復(fù)雜變量時奔害,要格外小 心。

Example #2 Heredoc結(jié)構(gòu)的字符串示例

<?php
   $str = <<<EOD
    Example of string
    spanning multiple lines
    using heredoc syntax.
    EOD;

    /*含有變量的更復(fù)雜示例*/
    class foo{
    var $foo;
    var $bar;
    
    function foo(){
      $this->foo = 'Foo'; 
      $this->bar = array('Bar1', 'Bar2', 'Bar3');
    }
}
     $foo = new foo();
     $name = 'MyName';

echo <<<EOTMy name is "$name". I am printing some $foo>foo.
Now, I am printing some {$foo>bar[1]}.
This should print a capital 'A': x41EOT;
?>

以上會輸出:

My name is "MyName". I am printing some Foo.
Now, I am printing some Bar2.
This should print a capital 'A': A

也可以把Heredoc結(jié)構(gòu)用在函數(shù)參數(shù)中來傳輸數(shù)據(jù):

Example #3 Heredoc結(jié)構(gòu)在參數(shù)中的示例

<?php
  var_dump(array(<<<EOD
  foobar!
  EOD
));
?>

在PHP5.3.0以后地熄,也可以用Heredoc結(jié)構(gòu)來初始化靜態(tài)變量和類的屬性和常量:

Example #4 使用Heredoc結(jié)構(gòu)來初始化靜態(tài)值

<?php
   //靜態(tài)變量
   function foo(){
      static $bar = <<<LABEL
      Nothing in there...
      LABEL;
    }

     //類的常量华临、屬性
     class foo{
        const BAR = <<<FOOBAR
        Constant example
        FOOBAR;
        public $baz = <<<FOOBAR
        Property example
        FOOBAR;
    }
?>

在PHP5.3.0中還在Heredoc結(jié)構(gòu)中用雙引號來聲明標識符:

Example #5 在heredoc結(jié)構(gòu)中使用雙引號

<?php
   echo <<<"FOOBAR"
   Hello World!
   FOOBAR;
?>
NOTE:
PHP4才引入了Heredoc結(jié)構(gòu)。

Nowdoc結(jié)構(gòu)

就像heredoc結(jié)構(gòu)類似于雙引號字符串端考,Nowdoc結(jié)構(gòu)是類似于單引號字符串的雅潭。Nowdoc結(jié)構(gòu)很像heredoc結(jié)構(gòu),但是nowdoc不進行解析操作却特。這種結(jié)構(gòu)很適合用在不需要進行轉(zhuǎn)義的PHP代碼和其他大段文本扶供。與SGML的<![CDATA[ ]]>結(jié)構(gòu)是用來聲明大段的不用解析的文本類似,nowdoc結(jié)構(gòu)也有相同的特征裂明。
一個nowdoc結(jié)構(gòu)也用和heredocs結(jié)構(gòu)一樣的標記<<<椿浓,但是跟在后面的標識符要用單引號括起來,就像<<<'EOT'這樣。heredocs結(jié)構(gòu)的所有規(guī)則也同樣適用于nowdoc結(jié)構(gòu),尤其是結(jié)束標志符的規(guī)則扼菠。

Example #6 Nowdoc結(jié)構(gòu)字符串示例

<?php
$str = <<<'EOD'
Example of string
spanning multiple lines
using nowdoc syntax.
EOD;

/* 含有變量的更復(fù)雜的示例 */
class foo{   
 public $foo;   
 public $bar;    

function foo()    {        
$this->foo = 'Foo';        
$this->bar = array('Bar1', 'Bar2', 'Bar3');    
}
}

$foo = new foo();
$name = 'MyName';

echo <<<'EOT'
My name is "$name". I am printing some $foo>foo.
Now, I am printing some {$foo>bar[1]}.
This should not print a capital 'A': x41
EOT;
?>

以上例子會輸出:

My name is "$name". I am printing some $foo->foo.
Now, I am printing some {$foo->bar[1]}.
This should not print a capital 'A': x41
Note:
不象 heredocs結(jié)構(gòu),nowdocs結(jié)構(gòu)可以用在任意的靜態(tài)數(shù)據(jù)環(huán)境中,最典型的示例是用來初始化類的屬性或常量:
###Example #7 表態(tài)數(shù)據(jù)的示例
<?php
class foo {    
public $bar = <<<'EOT'
bar
EOT;}
?>
Note:
Nowdoc結(jié)構(gòu)是在PHP 5.3.0中加入的唧垦。

變量解析

當(dāng)字符串用雙引號或heredoc結(jié)構(gòu)定義時捅儒,其中的變量將會被解析。
這里共有兩種語法規(guī)則:一種簡單規(guī)則,一種復(fù)雜規(guī)則巧还。簡單的句法規(guī)則是最常用和最方便的鞭莽, 它可以用最少的代碼在一個字符串中加入變量, 數(shù)組 值麸祷,或 對象屬性澎怒。
復(fù)雜的句法規(guī)則是在PHP4以后加入的,被花括號包圍的表達式是其明顯標記阶牍。

簡單句法規(guī)則

當(dāng)PHP解析器遇到一個美元符號 ($) 喷面, 它會和其它很多解析器一樣,去盡量形成一個合法的變量名走孽【灞玻可以用花括 號來明確變量名的界線。

<?php
$beer = 'Heineken';
echo "$beer's taste is great"; //有效磕瓷;單引號"'"是非法的變量名組成元素
echo "He drank some $beers";  //無效;字母s是有效的變量名組成元素盒齿,但是這里的變量是$beer
echo "He drank some ${beer}s"; // 有效
echo "He drank some {$beer}s"; // 有效

類似的,一個 數(shù)組 索引或一個 對象 屬性也可被解析困食。數(shù)組索引要用方括號 (]) 來表示邊際边翁, 對象屬性則是和上述的變量規(guī)則相同。

<?php
// 下面的例子是在字符串中引用數(shù)組
// 當(dāng)數(shù)組處于字符串外部時硕盹,要把數(shù)組的值用括號括起來且不要用花括號{ }

// 顯示所有錯誤
error_reporting(E_ALL);
$fruits = array('strawberry' => 'red', 'banana' => 'yellow');

// 有效符匾;但是注意在字符串外面不能這樣引用數(shù)組echo "A banana is $fruits[banana].";

// 有效
echo "A banana is {$fruits['banana']}.";

// 有效,但是PHP會先尋找常量banana
echo "A banana is {$fruits[banana]}.";

// 無效莱睁,要用花括號待讳,這里將會產(chǎn)生一個解析錯誤echo "A banana is $fruits['banana'].";

// 有效
echo "A banana is " . $fruits['banana'] . ".";

// 有效
echo "This square is $square->width meters broad.";

// 無效,解決方法見復(fù)雜結(jié)構(gòu)
echo "This square is $square->width00 centimeters broad.";
?>

復(fù)雜句法規(guī)則

復(fù)雜句法規(guī)則不是結(jié)構(gòu)復(fù)雜而命名仰剿,而是因為它可以使用復(fù)雜的表達式创淡。
任何想用在字符串中標量變量,數(shù)組變量或?qū)ο髮傩远伎墒褂眠@種方法南吮。 只需簡單地像在字符串以外的地方那樣寫出表達式琳彩, 然后用花括號 { 和 }把它括起來。 由于 { 無法被轉(zhuǎn)義部凑,只有 $要緊挨著 {才會被認出來露乏,可以用 {$ 來表達 {$。下面的示例可以更好的解釋:

<?php
// 顯示所有錯誤error_reporting(E_ALL);

$great = 'fantastic';

// 無效涂邀,輸出:?This?is?{?fantastic}
echo "This is { $great}";

// 有效瘟仿,輸出: This is fantastic
echo "This is {$great}";
echo "This is ${great}";

// 有效
echo "This square is {$square->width}00 centimeters broad."; 

// 有效
echo "This works: {$arr[4][3]}";

// 這是錯誤的表達式,因為就象$foo[bar] 的格式不能在字符串以外的地方使用一樣比勉。
// 換句話說劳较,只有在PHP能找到常量foo 的前提下才會正常工作驹止;這里會產(chǎn)生一個E_NOTICE?(undefined?constant)級別的錯誤。
echo "This is wrong: {$arr[foo][3]}"; 

// 有效观蜗,當(dāng)在字符串中使用多重數(shù)組時臊恋,一定要用括號將它括起來echo "This works: {$arr['foo'][3]}";

// 有效
echo "This works: " . $arr['foo'][3];

echo "This works too: {$obj->values[3]->name}";

echo "This is the value of the var named $name: {${$name}}";

echo "This is the value of the var named by the return value of getName():{${getName()}}";

echo "This is the value of the var named by the return value of$object->getName(): {${$object->getName()}}";

// 無效,輸出: This is the return value of getName(): {getName()}
echo "This is the return value of getName(): {getName()}";
?>

也可以在字符串中用變量來調(diào)用類的屬性墓捻。

<?php
class foo {  
  var $bar = 'I am bar.';
}

$foo = new foo();
$bar = 'bar';
$baz = array('foo', 'bar', 'baz', 'quux');
echo "{$foo->$bar} ";
echo "{$foo->$baz[1]} ";
?>

以上例程會輸出:
I am bar.
I am bar.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末抖仅,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子砖第,更是在濱河造成了極大的恐慌撤卢,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件厂画,死亡現(xiàn)場離奇詭異凸丸,居然都是意外死亡,警方通過查閱死者的電腦和手機袱院,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進店門屎慢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人忽洛,你說我怎么就攤上這事腻惠。” “怎么了欲虚?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵集灌,是天一觀的道長。 經(jīng)常有香客問我复哆,道長欣喧,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任梯找,我火速辦了婚禮唆阿,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘锈锤。我一直安慰自己驯鳖,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布久免。 她就那樣靜靜地躺著浅辙,像睡著了一般。 火紅的嫁衣襯著肌膚如雪阎姥。 梳的紋絲不亂的頭發(fā)上记舆,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天,我揣著相機與錄音呼巴,去河邊找鬼泽腮。 笑死泊愧,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的盛正。 我是一名探鬼主播,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼屑埋,長吁一口氣:“原來是場噩夢啊……” “哼豪筝!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起摘能,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤续崖,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后团搞,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體严望,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年逻恐,在試婚紗的時候發(fā)現(xiàn)自己被綠了像吻。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡复隆,死狀恐怖拨匆,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情挽拂,我是刑警寧澤惭每,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站亏栈,受9級特大地震影響台腥,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜绒北,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一黎侈、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧镇饮,春花似錦蜓竹、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至钙勃,卻和暖如春蛛碌,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背辖源。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工蔚携, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留希太,地道東北人。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓酝蜒,卻偏偏與公主長得像誊辉,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子亡脑,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,901評論 2 345

推薦閱讀更多精彩內(nèi)容