官术网_书友最值得收藏!

第二部分 PHP篇

第3章 PHP基礎

3.1 PHP的工作原理

PHP(Hypertext Preprocessor)是當下最受歡迎的Web開發語言之一。PHP最初由Rasmus Lerdorf創建于1995年,而現在,PHP的標準由PHP Group和開放源代碼社區負責維護。PHP以PHP License作為許可協議,因為該協議限制了PHP名稱的使用,所以和開放源代碼許可協議GPL不兼容。

PHP的應用范圍相當廣泛,尤其是Web應用。一般來說,PHP大多在服務器端執行,通過執行PHP代碼來產生用戶瀏覽的頁面。此外,還可以用來開發命令行腳本程序和客戶端的GUI應用程序。PHP可以在多種不同的服務器和操作系統平臺上執行,也可以和多種類型的數據庫系統結合使用,其中的最佳搭檔是MySQL。PHP是完全免費的,官方組織PHP Group提供了完整的程序源代碼,允許用戶修改、編譯和擴展。根據2010年4月的統計資料顯示,PHP已經被安裝在超過4000萬個網站和300萬臺服務器上。

PHP的工作原理如圖3-1所示。

圖3-1 PHP的工作原理示意圖

3.2 PHP的版本變遷

經過近15年的發展,PHP在不斷發展和成熟的過程中經歷了從1.0到5.0的多個版本,為了使得初學者對PHP有一個全面的認識,本書特將PHP的版本變化歷程詳盡地呈現了出來,如表3-1所示,其中不僅包含了各個版本的現有狀態和發布時間,更重要的是介紹了各個版本在功能特性上所做的重要改進和更新。其中,從PHP 1.0.0到PHP 5.1.0為舊版本,官方已經停止支持;從PHP 5.2.0到PHP 5.2.9也為舊版本,但官方仍在維護中;PHP 5.3.6為當前最新的版本;PHP 6.0則是下一個即將發布的重大版本。

表3-1 PHP的版本變化歷程

3.3 PHP的特性

在學會使用PHP之前,我們先來看看PHP具有哪些特性,具體如下所示。

?PHP完全免費和開源,升級快,同時有很多成熟的框架支持,如ZendFramework、ThinkPHP、FleaPHP、CakePHP等。

?支持模板化開發,實現程序邏輯與用戶界面的完全分離,開發周期短、效率高。

?PHP的便捷性:程序開發快,運行快,易于學習。

?具有良好的跨平臺性:由于PHP是運行在服務器端的腳本,支持UNIX、Linux、Windows、FreeBSD、OS2等多種操作系統平臺。

?同目前主流的技術相兼容,如WebService、Ajax、XML等技術都支持PHP。

?簡單的語言:PHP堅持以腳本語言為主,與Java和C++不同。

?支持所有的主流與非主流數據庫,支持JDBC,提供MySQL、Oracle、Sybase和SQL Server等多種數據庫的訪問接口。

?面向對象:在PHP4和PHP5中,面向對象方面都有很大的改進,現在PHP完全可以用來開發大型的商業程序。

?相對于其他語言,PHP的編輯簡單,實用性強,更適合初學者。

3.4 PHP的應用范圍

PHP幾乎可以做任何事情。由于PHP是服務器端的腳本語言,所以其他CGI程序能做到的事情它同樣也能做到,如表單提交的數據、生成動態網頁、接/發cookie,而且PHP還可以做得更多。

PHP腳本主要應用于以下三個領域:服務器端腳本、命令行腳本、編寫桌面應用程序。直至今日,PHP已經可以支持絕大多數的Web服務器,如Apache、IIS、Nginx、PWS、Netscape、iPlant server、Xitami等。

由此可見,PHP可以任意選擇操作系統和Web服務器。而且在開發PHP項目的時候可以選擇使用面向過程或面向對象的程序設計方法,或二者并用。PHP 5包括新的對象模型,擁有更多新的功能、更快的處理速度、代碼質量更高、企業項目的開發更容易等優點。

3.5 PHP的基本語法

3.5.1 PHP標記

多數情況下,PHP代碼都是與HTML代碼混在一起的。當包含了PHP程序的頁面被請求時,Web服務器會自動編譯、處理頁面中“<?php”標記和“?>”標記之間的代碼,并將處理后的結果以HTML的形式發送到頁面中,從而在頁面中顯示處理結果。

要想讓Web服務器能夠區分PHP代碼與普通的HTML代碼,就要將PHP代碼放在特殊標記內,PHP一共提供了4種不同的標記風格供我們使用,如下所示:

(1)<?php...?>

官方推薦風格,標記之間的代碼將被自動解釋為PHP腳本語言。

(2)<?...?>

短標記風格,使用這種標記之前須在配置文件php.ini中將short+open_tag設置為開啟,不推薦這種風格。

(3)<%...%>

ASP風格,使用這種標記之前須在配置文件php.ini中將asp_tags設置為開啟。

(4)<script language="php"> ...</script>

JavaScript標記的風格,這種標記風格是最長的,如果讀者使用過JavaScript或VBScript,就會熟悉這種風格。如果你所使用的HTML編輯器無法支持其他標記風格,則可以使用它。這種風格在任何環境下都是可以用的,只是我們并不常使用。

3.5.2 PHP中的注釋

為代碼添加注釋是一種良好的編程習慣,不僅可以使程序更清晰,也更利于團隊開發。PHP提供的注釋主要有兩種類型:單行注釋和多行注釋,這兩種注釋的語法和示例如下所示。

(1)單行注釋

?C++風格的單行注釋

注釋通常不會超過一行。因為這種注釋很簡短,所以沒必要界定注釋的結束。PHP支持C++的單行注釋語法,在某一行代碼中,//符號后面的所有內容均被視為注釋,如下所示:

        //這里寫注釋內容

?shell風格的單行注釋

PHP還支持另一種C++風格的單行注釋,稱為shell風格,它以#號開頭。在某一行代碼中,#符號后面的所有內容均被視為注釋,如下所示:

        #這里寫注釋內容

(2)多行注釋

代碼中通常要有一些詳細的功能描述或其他的解釋內容,這些說明可能有多行。雖然可以在每行的前面都加上C++或shell風格的注釋符,但PHP還支持一種多行注釋的形式,同時標注注釋的開始和結束。多行注釋以/*符號開頭,以*/符號結束,在這兩個符號之間可以寫入多行注釋,如下所示:

        /*
        *這里寫注釋內容
        */

3.5.3 編寫你的第一個PHP應用

前面已經搭建好了PHP的開發環境,現在來學習究竟如何編寫PHP應用,讓我們先從一個簡單的“Hello World!”應用開始吧。先新建一個helloworld.php文件,輸入以下的代碼,并將該文件放入www文件夾內,在瀏覽器中輸入http://127.0.0.1:80/helloworld.php,你將看到如圖3-2所示的結果。

圖3-2 “Hello World!”運行結果圖

        <html>
            <body>
            <h1><?php echo "Hello World!"; ?></h1>
            </body>
        </html>

3.6 PHP中的變量與常量

3.6.1 變量

最好的理解是把變量想象為存儲數據的容器。PHP中的變量本質上是靈活多變的:可以為一個變量賦值、在變量中檢索數據(而不影響變量的值)、為變量賦新的值,以及在需要的時候進行循環。但是PHP中的變量也是臨時的,它們只存在于一個腳本的執行期間,也就是說,它們只有在此時才有一個值。當用戶單擊一個鏈接或者提交表單時,將獲得一個新的頁面,同時這些變量也將不復存在。除非使用特殊的方法改變他們的生存期。

1. 變量聲明

我們已經對變量有了一個初步的了解,在掌握了正確的語法后,就可以自己創建變量。變量總是以美元符號$開頭,然后是變量名。聲明變量時必須遵循如下規則:

?所有的變量名必須以美元符號($)開頭。

?美元符號后的第一個字符必須為字母(A~Z,a~z)或者下劃線(_)(不能使用數字)。

?變量名剩下的部分可以是任何數量的字母、數字和下劃線組合。

?變量名中不能出現空格(通常使用下劃線進行字符分隔)。

?變量名是區分大小寫的,這就意味著$phpchina和$PHPChina是截然不同的變量,因此將兩個變量進行如此相似的命名是非常不明智的。

這些變量是合法的:$phpchina、$phpchina_zend、$_phpchina。

注意

與其他語言不同,PHP通常不需要在使用變量前聲明或初始化變量。換句話說,可以在定義變量類型之前先引用。盡管如此,最好還是不要這樣做,好的編程習慣是:所有的變量都應當在使用前進行聲明,最好還要帶有注釋。

2. 變量賦值

聲明變量之后,就可以為其賦值。變量賦值有兩種方法:值賦值和引用賦值。所謂值賦值就是將賦值表達式的值復制到變量中,這是最常見的一類賦值。下面是幾個例子:

        <?php
        $name_1='張三';
        $name_2 = $name_1;          //為$name_1的值創建一個副本,賦值給$name2
        $name_1='李四';             //改變$name_1的值
        echo $name_2;               //結果會輸出“張三”,$name_2的值不會因$name_1的改變而改變
        ?>

如果希望兩個變量指向一個值的同一個副本,則需要通過引用賦值,下面將介紹引用賦值。

PHP4提供了一種新的方式給變量賦值,這就是引用賦值。引用賦值同樣也是使用“=”將一個變量的值賦給另一個變量,但是需要在等號右邊的變量前加上一個“&”符號。實際上這種賦值方式并不是真正意義上的賦值,而是一個變量引用另一個變量。在使用引用賦值時,兩個變量將會指向內存中的同一個存儲空間。因此任何一個變量的變化都會引起另外一個變量的變化。使用引用賦值的示例如代碼清單3-1所示:

代碼清單3-1引用賦值示例

        <?php
        $name_1 = '張三';
        $name_2 = '李四';
        //這里將新變量$name_2指向$name_1;
        $name_2 = &$name_1;
        //改變$name_2的值
        $name_2 = 'Bob';
        $name_2 = 'My name is'.$name_2;
        //輸出原始變量$name_1
        Echo $name_1;
        ?>

使用以上的引用賦值時將輸出如圖3-3所示的結果。

圖3-3 引用賦值示例的結果

3. 可變變量

PHP支持對變量名稱進行動態解析,也就是說,可以將變量名存儲在另一個變量名中。如B變量存儲了A變量的名稱,通過對B變量的解析,即可得到A變量的值,如代碼清單3-2所示。

代碼清單3-2可變變量

        <?
        /*
        *$temp_2:變量A        $temp_1:變量B
        */
        $temp_1 = 'temp_2';                 //變量B存儲了變量A的名稱
        $temp_2 = "I'm temp_2";             //為變量A賦值
        echo $temp_1;                       //將輸出I'm temp_2
        ?>

注意 因為可變變量會使代碼變得難以閱讀和理解,所以在項目開發中應盡量少用。

4. 變量作用域

總之無論怎樣聲明變量(按值或按引用),在PHP腳本的任何位置都可以聲明變量。但是,聲明的位置會大大影響變量的訪問范圍,這個可訪問的范圍稱為作用域。PHP變量有4種作用域:

(1)局部變量

在函數中聲明的變量被認為是局部變量,即它只能在該函數中引用。如果在函數外賦值,將被認為是完全不同的另一個變量。注意,退出聲明變量的函數時,該變量及相應的值就會撤銷。

局部變量的作用非常大,因為它消除了出現意外副作用的可能性,否則,這些副作用將導致全局訪問的變量被有意或無意地修改。

(2)函數參數

PHP與其他很多編程語言一樣,任何接收參數的函數都必須在函數的首部中聲明這些參數。雖然這些參數接收函數外部的值,但退出函數后就無法再訪問這些參數。

注意

雖然在聲明參數的函數內部可以訪問和處理這些參數,但當函數執行結束時,參數就會被撤銷。

?全局變量

與局部變量相反,全局變量可以在程序的任何地方訪問。但是,為了修改一個全局變量,就必須在要修改該變量的函數中將其顯式地聲明為全局變量。這點很容易做到,只要在變量的前面加上關鍵字GLOBAL即可將其標識為全局變量。如果將GLOBAL關鍵字放在一個已有的變量的名稱前面,則表示PHP要使用同名的變量。

注意

無論用何種方法將變量轉換為全局變量,都要當心。全局變量一直以來都是困擾程序員的一個問題,因為草率使用會導致意外的結果。

?靜態變量

靜態變量的作用域稱為靜態(static)作用域。函數參數的值在函數退出時會被撤銷,與聲明為函數參數的變量不同,靜態變量在函數退出時不會丟失值,當再次調用此函數時還能保留這個值。在變量名前面加上關鍵字STATIC就可以聲明一個靜態變量。

5. 超級全局變量

PHP提供了很多有用的預定義變量,可以在執行腳本的任何位置訪問,用于提供與環境有關的大量信息。可以通過這些變量獲得關于當前用戶的會話、用戶操作環境和本地操作環境等詳細信息。PHP會創建部分變量,而其他許多變量的可用性和值則取決于操作系統和Web服務器。PHP的全部超級全局變量如下所示:

?$GLOBALS:包含所執行腳本內部全部可用的變量所組成的數組,數組的鍵即為變量的名稱。

?$_SERVER:包含正在執行的腳本的周邊環境信息,例如服務器的名稱和正在運行的頁面的名稱等。

?$_GET和$_POST:包含可發送到服務器的變量。其中$_GET以url的形式傳參,而POST則以包的形式傳參。$_GET有字數限制(一般為2083B),且以url方式傳參安全性不高,相對的,$_POST理論上沒有字符限制,以HTTP包的形式傳參,安全性更高。

?$_SESSION和$_COOKIE:SESSION可以儲存用戶整個會話過程中的狀態信息。COOKIE可設置并在本地保留明碼信息。

?$_REQUEST:用戶輸入的所有變量數組,包含$_POST、$_GET和$_SESSION數組。

3.6.2 常量

常量是指在程序執行中無法修改的值。當處理絕對不需要修改的值時,常量非常有用,例如π(3.141592)。常量一旦定義,就無法在程序的其他地方修改(或重新定義)。

1. 自定義常量

在PHP中使用define定義常量。常量一經定義就永遠不能改變,如果要再次定義常量值,則會產生警告并且再次定義的值會被忽略。查看常量是否被定義可以使用函數defined,函數的返回值為布爾類型。其形式如下:

        boolean define(staring name,mixed value[, bool case_insensitive])

如果使用可選參數case_insensitive,并且這個參數的值為TRUE,那么后面對此常量的引用將不區分大小寫。下面來看一個簡單的示例:

        <?php
            define("PI", 3.141592);               //聲明一個常量PI
            $pi2 = 2 * PI;                          //使用常量PI
            Print("PI doubled equals f%", $pi2);
        ?>

定義常量名稱時不可用字符“$”開頭,并且常量的值只能是特定的類型,如整數、浮點數、字符串和布爾值。

2. 魔術常量

PHP為它運行的任何腳本提供了大量的預定義常量。不過很多常量都是由不同的擴展庫來定義的,只有在加載了這些擴展庫時才會出現,或者動態加載后,或者在編譯時已經包括進去了。有5個魔術常量需要根據它們使用的位置而改變,具體說明可參考表3-2。

表3-2 魔術常量參照表

最后要提醒大家,魔術常量的值會根據使用該常量的文件位置的改變而改變,這些特殊常量不區分大小寫。

3.7 表達式

表達式是PHP最重要的組成元素,下面是幾個例子:

        $a = 5;                      //將整數5賦予變量$a
        $a = '5';                    //將字符串5賦予變量$a
        $sum = 5 + $a;               //將5+$a的結果賦予變量$sum

3.7.1 表達式分類

下面來看一個簡單的表達式:

        <?php
        $a = 100; //賦值語句,$a=100是最簡單的表達式
        ?>

從這個表達式中可以看到只有一個操作數$a。因此根據運算數的個數,PHP表達式一般可以分成三類:

?單目表達式:運算數只有一個,如$a或zhanglei等;

?雙目表達式:運算數有兩個,如$a+$b,$a=100等;

?三目表達式:運算數有三個,如$a ? $b:$c。

3.7.2 表達式的應用

下面先給出一個包含常量和變量的簡單例子。當你寫$a = 5時,即將值'5'賦給了$a(這種情況下,5是一個整型常量)。在此,你是希望把$a賦值成5,所以當你寫$b = $a時,希望的結果就是$b = 5,即$a是一個值為5的表達式。復雜表達式多應用在函數部分。例如,以下函數:

        function foo() {
        return 5;
        }

如果你認為$c = foo()和$c = 5實際上是一樣的,那么你是對的。函數是值為其返回值的表達式。因為foo()返回5,所以表達式foo()的值為5。

PHP的值當然不限于整型,且通常都不是。PHP支持三種類型的值:整型值、浮點值和字符串值。PHP還支持兩種混合類型(non-scalar):數組和對象。這兩種類型的值可以賦給變量或從函數中返回。PHP還是一種面向表達式的語言,所以幾乎所有的東西都可成為表達式。考慮前面已經討論過的例子$a = 5,很容易看出這里有兩個值,整型常量5的值和已被賦為5的變量 $a的值。但是這里實際上還有一個附加的值,就是賦值語句本身的值。賦值語句本身的值就是被賦予的值,本例中為5。事實上,它意味著不考慮$a = 5要做什么,它就是一個值為5的表達式。這樣,諸如$b = ($a = 5)的語句,就如同$a = 5; $b = 5;(每條語句末尾都有一個分號)。因為賦值的順序可以從右向左,所以也可以寫成$b= $a = 5。

最常見的表達式是比較表達式。這種表達式的計算結果是0或1,分別意味著false或是true。PHP支持 >(大于)、>=(大于等于)、==(等于)、<(小于)及 <=(小于等于)。這種表達式通常用于條件執行語句里,例如if語句。最后要討論的表達式是混合賦值表達式。你已經知道如果要使 $a加1,則可以簡單地寫一句$a++或++$a。但是,如果要增加的值比1大,那該怎么辦?例如要使它加3,你可以多寫幾次$a++,但這顯然不是一種高效的或令人樂于接受的辦法。另外一個通常的辦法是寫成$a = $a + 3。先計算$a + 3的值,再賦回到$a,這樣$a就加上3了。在PHP中,你可以像在其他幾種語言中(例如C)一樣將它簡寫,這樣更清晰和簡潔易懂。把當前的變量$a加3可以寫成$a += 3。這句話的意思是“取出$a的值,把它加3,再賦給$a”。這樣寫除了能使語句簡短和清晰,還能使它執行得更快。表達式$a += 3的值和一個嚴格的賦值語句一樣,是所賦的值。

注意

不是3,而是$a加3的值(這才是賦給$a的值)。任何雙操作符都可以用于這種賦值操作模式,例如'$a -= 5'(變量$a減去5),'$b *= 7'(變量$b乘以7),等等。

最后值得一提的是表達式的真值。很多時候(主要是在條件執行和循環時),你并不關心表達式的特定值,而只是關注它代表true還是false(PHP沒有專用的布爾類型)。PHP中使用類似Perl的方法來計算表達式的真值。任何非零的值為true,零則為false。請一定注意負數也是非零值,并被視為true。空字符串和字符串“0”為false,其他的字符串均為true。對于非數量值(數組和對象)—如果它的值不含任何元素,則為false,否則為true。

3.7.3 操作數

操作數是表達式的輸入。下面是操作數的一些例子:

        $a++;                                          //$a是一個操作數
        $sun = $value1 + $value2;                      //$sum,$value1和$value2都是操作數

3.7.4 操作符

操作符是用來操作各種操作數的符號,只有理解各種操作符的用法,才能更高效地開發出PHP程序。PHP會根據操作符的類型自動進行類型轉換,這在其他的編程語言中并不多見。

操作符根據功能特性可分為:算數操作符、賦值操作符、比較操作符、邏輯操作符和其他操作符。操作符的優先級和結合性是PHP語言特性中的重要部分,表3-3根據優先級從高到低的順序詳細介紹了PHP中的各種操作符。

表3-3 操作符優先級

對于表3-3所給的各個運算符的優先級,我們不必刻意全部記住。如果在開發過程中要使用復雜的表達式運算,可以通過添加“()”來限制各子表達式運算的優先級。

3.8 PHP中的數據類型

PHP提供了一個不斷擴充的數據類型集合,可以將不同的數據保存在不同的數據類型中。但PHP語言是一種弱類型檢查的語言,與其他語言不同的是,變量或常量的數據類型由程序的上下文來決定。在強類型語言中,變量要先指定類型,然后才可以存儲對應的指定類型的數據。而PHP這種弱類型語言,變量的類型則是由數據決定的。

PHP中的數據類型可劃分為三大類別:基本數據類型、復合數據類型和特殊數據類型。各種數據類型所包括的內容如表3-4所示。

表3-4 PHP數據類型分類

3.8.1 布爾型

布爾數據類型以數學家喬治·布爾的名字命名,他被認為是信息論的創始人之一。布爾變量表示真實性,布爾型是最簡單的數據類型,表達式的值只有TURE和FALSE兩個,不區分大小寫。

注意 -1和其他非零值(不論正負)一樣,被認為是TURE,而不是FALSE。

3.8.2 整型

整型就是一個不包含小數部分的數,整型值可以指定為十進制、十六進制或八進制,八進制數字前必須加上零(0),十六進制符號數字前必須加上0x。例如:

        $num_1 = 123    //一個十進制數
        $num_2 = 0123   //一個八進制數(等于十進制數中的83)
        $num_3 = 0x3A   //一個十六進制數(等于十進制數中的58)

因為PHP中不存在整除,所以,如果運算結果超出整型范圍,則返回float,即整型的1/2等于float 0.5。

3.8.3 字符串

字符串就是一個連續的字符的序列。一般可通過以下兩種方式指定一個字符串的值。

1. 單引號

當字符串應當按照聲明的原樣解釋時,可以使用單引號括起這個字符串。這表示,解析字符串時,變量和轉義序列都不會進行解析。示例如下:

        <?php echo 'this is a simple of string insingle-quoted.';?>

如果要在字符串中包含單引號,則需在它前面加上反斜線,這叫做字符的轉義(escape),示例如下:

        <?php echo 'this is a simple of string insingle-quoted(\').';?>

如果要在字符串中包含反斜線,則需要對反斜線進行轉義。示例如下:

        <?php echo 'this is a simple of string insingle-quoted(\\).';?>
2. 雙引號

相對于單引號的字符串,PHP處理程序會剖析雙引號括起的字符串,以便查找和替換特別的轉義序列和變量。PHP轉義序列如下所示:

        \n                   換行字符
        \r                   回車字符
        \t                   制表符
        \\                   反斜線字符
        \$                   美元符號
        \0                   值在0~255之間的字符,八進制表示法
        \x                   值在0~255之間的字符,十六進制表示法

3.8.4 數組

由多個數值以鍵值對的形式存儲而成的數據集合稱為數組,其中,鍵也稱為索引。由于PHP中的數組結構沒有固定的要求,所以非常靈活。PHP中數組的鍵不像Java那樣只能是數字,也可以是字符串,而由于PHP弱語言的特性,數組的值也可以是各種數據類型。

注意

在開發PHP項目的時候,應盡量避免數組中存在類似'<abc'這樣的值,瀏覽器在解析數組的值時,會將'<abc'解析為HTML標記,而由于標記不完整(沒有表示結束的'>'),所以數組后面的值將不會解析出來,這樣就會導致數據的丟失。

利用count()函數可以取得數組元素的個數。由于數組的值也可以是數組,所以在PHP中可以很輕松地創建多維數組。可使用print_r()將數組全部打印出來以便查看數組的結構。

數組排序

簡單的數組排序是對一個數組元素的值進行排序,PHP的sort()和rsort()函數實現了這個功能。這兩個函數既可以按照數字的大小排列,也可以按照字母的順序進行排列,并且具有相同的參數列表。

sort()函數會按照數組元素的值進行排序,按照先數字后字母的順序由小到大進行排序,排序后數組的索引將會重置。rsort()與sort()正好相反,它是按照由大到小的順序對元素的值進行排序。

使用數組時,會根據鍵名對數組重新排序,ksort()和krsort()函數實現了這個功能。ksort()函數按照數組的鍵名(索引順序)對數組進行由小到大的排序。krsort()函數和ksort()相反,是將數組進行由大到小的排序。

如果想使用數組中元素的值進行排序來取代鍵值排序,PHP也能滿足你的要求。只需要使用asort()函數來代替先前提到的ksort()函數就可以了,如果按值從大到小排序,則可以使用arsort()函數。asort()與sort()的功能類似,唯一的區別在于執行asort()排序后的數組索引將不會重置,完全保留原數組鍵值的對應信息。

注意

使用sort()函數排序后的數值型數組是按數據值的大小進行排序的,字符型數組是按ASCII碼的順序進行排序的。如果一個數組的內容中同時包含英文字符、漢字字符和數字,使用sort()函數進行排序的順序則依次為數字、英文字符和漢字字符。

3.8.5 對象

創建對象的過程稱為實例化,當一個對象被創建后,就包含了三個方面的特性:句柄、屬性和方法。在面向對象的程序設計中,對象是一個非常重要的核心概念。

1. 對象的句柄

對象被創建后,該對象就會獲得一塊存儲空間,該控件的地址即為對象的標識,也就是對象的句柄。

2. 屬性與方法

在面向對象編程中,模塊被組織成一個個對象。這些對象擁有方法和屬性,從抽象的角度來看,方法是一個對象所做的動作,而屬性是對象的特性。從編程的角度來看,方法就是函數,而屬性就是變量。在一個理想化的面向對象體系中,每個部分都是一個對象,體系由對象及對象間通過方法形成的聯系所構成。

關于對象的具體應用,將在第8章詳細介紹。

3.8.6 其他類型

除了上面講到的類型,PHP在特定情況下會用到以下幾種類型:

1. 資源

PHP有時會處理一些數據庫連接或操作系統對象的句柄。它們是被稱為資源(resource)的特殊變量。一般情況下,資源在函數之間傳遞,這些函數知道如何處理它們。當不再需要這些資源時,PHP就會自動釋放它們。

2. NULL

NULL是PHP中的特殊類型和值,它代表“無值”。如果變量符合下列要求,則它們的值為NULL。

?被設置為大小寫敏感的關鍵字NULL。

?從未被賦過值。

?使用unset()方法后清除。

NULL、0、空字符的區別:NULL表示無值,0和空字符表示有值,值為0和空。

3.9 強制類型轉換

在項目開發中,經常會用到類型轉換,例如把商品的價格由整型轉換為字符型,與別的信息連在一起組成一張價目表。

3.9.1 顯式和隱式強制類型轉換

1. 隱式強制類型轉換

隱式強制類型轉換是一種最常見的轉換方式,也是由PHP語言引擎自動解析的轉換方式。

最簡單的例子是:將一個整數與一個浮點數進行數學運算,PHP會將整數轉換成浮點數后再進行運算;又如,將一個字符串與一個整數進行數學運算,PHP會將字符串轉換成整數后再進行運算。一些特定的方法和操作符也會將參數進行轉換,例如,echo方法和print方法需要它們的參數為字符串,在執行操作時,PHP會盡可能地將非字符串變量轉換為字符串。

2. 顯式強制類型轉換

有時,PHP引擎認為轉換類型后的數據會改變或丟失,將不自動轉換,在這種情況下,可以使用(type cast)的方式顯式強制轉換某變量的值。

?(int)/(integer):轉換為整數

?(float)/(double)/(real):轉換為浮點數

?(string):轉換為文本字符串

?(bool)/(boolean):轉換為布爾值

?(array):轉換為數組

?(object):轉換為對象

3.9.2 有用的強制類型轉換函數

is_type():判斷當前是否為某種類型的變量。

gettype:得到當前變量的類型。

settype:有兩個參數為要轉換的變量和要轉換的類型,函數返回布爾值,表示轉換成功。

3.10 PHP的語句

任何復雜的程序設計都離不開流程控制語句,這些語句決定了程序的走向。PHP中共包含了三種控制結構:順序結構、分支結構和循環結構。

3.10.1 循環語句

程序中經常會有些代碼塊要被執行多次,雖然形式可能會有所不同,但是所有流行的編程語言中都必定有循環語句。這不奇怪,因為往往需要重復一段指令直到滿足特定條件為止,這是程序中非常常見的,而循環機制為此提供了一種簡單的方式。PHP為此提供了幾種這樣的循環機制,如果你熟悉其他編程語言,應該會很快掌握。

1. while循環

while語句制定了一個條件,在其嵌入的代碼執行結束前,必須滿足這個條件。其語句格式是:

        while(condition){    //條件
        statement;           //執行語句
        }

循環流程:condition返回值為true時,繼續執行statement語句,之后接著檢查condition條件。condition返回值為false時,直接跳出循環,不再執行statement語句。使用continue和break都可以跳出循環。區別在于,continue只跳出一次循環,跳出后繼續檢查condition條件,而break則直接跳到循環外。

2. do...while循環

do...while循環條件是while的一種變體,它在代碼塊的結束處驗證循環條件,而不是在開始處。其語句格式是:

        do
        {
            statement
        }while(condition)

循環流程:首先執行一次statement語句,再檢查condition條件,后面的流程與while循環一樣。do...while循環與while循環的唯一區別在于while循環先檢查條件,而do...while循環則先執行一次statement語句再檢查條件。

3. for循環

for語句提供了比while語句更加復雜的循環機制。其語句格式是:

        for(expression1; expression2; expression3){
            循環體
        }

expression1的作用是初始化變量;expression2是一個循環控制語句,返回一個布爾值;expression3用于控制變量的遞增或遞減,即用于控制循環次數。

循環控制語句返回一個布爾值,為true時,繼續執行下面括號中的循環體;為false時,停止循環。

使用PHP的for循環,需要記住以下幾點規則:

?第一個表達式expression1在第一次循環時自動進行運算。

?第二個表達式expression2在每次循環時進行計算。這個表達式用來確定是否繼續循環。

?第三個表達式expression3在每次循環結束時進行計算。

?任何一個表達式都可以為空,它們可以由for塊內部的邏輯所取代。

3.10.2 條件判斷語句

順序結構的程序雖然能解決計算和輸出等問題,但進行判斷后就不能再選擇了。對于要先做判斷再做選擇的問題就要使用分支結構,這種結構又稱為選擇結構或條件結構。分支結構的執行是依據一定的條件選擇執行路徑,而不是嚴格按照語句出現的物理順序執行。分支結構程序設計方法的關鍵在于構造合適的分支條件和分析程序流程,根據不同的程序流程選擇適當的分支語句。分支結構適合于帶有邏輯或關系比較等條件判斷的計算。即程序在執行過程中依照條件的結果來改變程序執行的順序,滿足條件時執行某一語句塊,反之則執行另一語句塊。

1. if語句

if、else和else if語句經常一起被使用,這3個語句中只有if可以單獨使用,而else和else if語句則需要與if語句結合使用。

語句格式:

        if(condition)
        {
            statement
        }else if(condition){
            statement
        }else{
            statement
        }

else if語句在if的condition為false時,逐個往下執行,若condition為true時,則執行內部的statement;若沒有,則繼續向下查看else if語句。若所有else if的condition為false,有else語句則執行else語句內的statement,沒有則繼續往下執行。

if else語句內部仍可套用if else語句來做更細致的判斷。可根據下面的代碼來修改$num的值來查看判斷的流程。

          <?php
          $num = 5;
          if($num>3){
              echo 'num>3<br/>';
              if($num<6){
                echo 'num<6<br/>';
              }else{
                echo 'num>=6<br/>';
              }
          }else if($num<3){
              echo 'num<3<br/>';
              if($num>-1){
                echo 'num>-1<br/>';
              }else if($num<-1){
                echo 'num<-1<br/>';
              }else{
                echo 'num=-1<br/>';
              }
          }else{
              echo 'num=3<br/>';
          }
          ?>
2. switch語句

對于條件判斷結果很多的情況,如果使用if語句將會變得非常麻煩,這時可以使用switch選擇語句。語句結構:

        switch($temp)
        {
            case 'value_1': statement; break;
            case 'value_2': statement ; break;
            case 'value_3': statement ; break;
                    ·
                    ·
            default: statement;
        }

執行流程:從第一個case開始判斷,若$temp的值等于value_1,則執行case 'value_1'冒號后面的語句,若沒有則繼續向下執行。若執行語句后有break,則case找到對應的語句執行完后直接跳出switch語句;若沒有break語句,則將后面所有case語句的statement都執行一遍,直到遇到break才跳出。default可寫可不寫,當遍歷所有case后都沒有與$temp對應的值時,則執行默認的default語句。

switch語句在多個值匹配一個變量的情況下非常管用,雖然if else語句也可以實現同樣的效果,但switch語句執行起來更快捷、更簡單,而且更穩定,遇到復雜的邏輯判斷時語句結構也一目了然。

3.11 小結

本章介紹了PHP的工作原理及發展狀況,并通過一些簡單的示例對PHP基礎語法、變量和常量、數據類型、數據類型之間的轉換、表達式和運算符,以及流程控制語句等知識點進行了介紹。掌握這些基礎知識將會為以后更好地掌握PHP打下堅實基礎。

主站蜘蛛池模板: 望城县| 盐山县| 太原市| 剑河县| 长治市| 苏州市| 登封市| 渑池县| 伊川县| 武强县| 彭州市| 灵山县| 东阳市| 长治市| 永福县| 河东区| 石阡县| 伊春市| 温宿县| 蒙山县| 洞头县| 台南市| 琼结县| 汤阴县| 民勤县| 合江县| 安图县| 祁东县| 天长市| 忻州市| 弋阳县| 宜君县| 清水河县| 泗阳县| 周宁县| 琼海市| 望谟县| 留坝县| 科技| 望都县| 开鲁县|