The PHP Language
PHP指令碼通常與副檔名.php一起儲存,以表示其型別。每當您的Web伺服器被要求傳送以.php結尾的檔案時,它首先將其短語傳送到php直譯器,該直譯器在將生成的檔案返回給終端使用者之前執行指令碼中的任何PHP程式碼。 php程式碼的基本單元稱為語句,以分號結尾,表示它是一個完整的語句。一行程式碼通常只包含一個語句,但您可以根據需要在一行中包含儘可能多的語句。
喜歡php的人會想指出列印在技術上不是一個功能,從技術上來說它們是正確的。這就是為什麼列印在傳遞給資料時不需要資料括號的原因。您可以將括號與這些結構一起使用,這樣做是無害的。雖然在表面上,印刷和回聲看起來是相同的,但它們不是。 print構造比echo更有可能是一個函式,因為它返回一個值(1)。但是,echo更有用,因為您可以傳遞幾個引數。
php中的變數,這些是儲存資料的東西,它們以$開頭,後跟字母或下劃線,然後是字母,數字和下劃線字元的任意組合。在PHP變數中不要以數字開頭。變數也區分大小寫。所以$ N和$ n有兩種不同的含義。
您可以通過編寫變數名稱後跟“=”符號然後再使用其值來分配變數,並使用分號(;)結束該語句。
在那裡我們將$ a變數設定為字串Donald,並且php允許我們在您的名字後打印出該變數。因此,第一個print語句的輸出是誰是唐納德,因為只要它自己找到它,或者在雙引號字串中,php就會用$ a替換它的值。
之後我們將$ name_2設定為$ a,這有效地將$ a的值複製到$ name_2中。 $ name_ 2現在是唐納德。我們還將$ age變數設定為數字77.我們的第二個print語句一次輸出兩個變數,同樣,php將在字串中替換它們。
但是,最後一份印刷宣告不會用唐納德取代$ a。相反,它會打印出來。
原因是php不會在單引號字串中執行變數替換,甚至不會替換大多數轉義字元。在雙引號字串中,PHP將用單引號字串替換$ a及其值。 PHP會考慮$ a意味著你實際上希望它輸出下一個$ a就像那樣。
當你想在字串中追加變數時。 PHP可能會認為字元是變數的一部分。例如:
雖然期望的輸出是這些芒果尚未成熟,但實際輸出有點不同,因為我們在變數名稱的末尾添加了“s”,我們已將其從嘗試讀取$ fruit更改為嘗試讀取$果實。變數$ fruits不存在,因此PHP會將空格留空並可能生成錯誤。有兩種方法可以解決它:
大括號{和}在技術上用於在字串中使用時發出變數訊號,但在上面的示例中,它們用於告訴PHP變數的結束位置。您不需要使用大括號,其中附加到變數的字元會使變數名稱非法,如下所示:
這將有效,因為您不允許使用撇號作為變數名稱的一部分。
開啟PHP程式碼島有很多方法,歡迎您選擇自己喜歡的方式。推薦的方式是使用離開php模式,但你也可以使用短標籤版本.
簡短版本有一個很大的優點和兩大缺點,您可以通過使用特殊的短標籤hack從指令碼輸出資訊, <?=, like this.
短標籤版本更緊湊,閱讀起來有點難。然而,短版本的第一個缺點是它與XML有衝突,而XML也使用<? to open code blocks. This means that if you try to use XML and short tagged php together, you will encounter problems this is the primary reason people recommend using the normally open and close tags. Short tags are always dangerous because they can be disabled in the php configuration file, php.ini, which means your scripts may not be portable.
PHP允許您根據條件的結果選擇要採取的操作。這種情況可以是您選擇的任何條件,您可以結合條件採取更復雜的行動。這是一個例子:
在最基本的層面上,php評估if語句是否從左到右,這意味著它首先檢查$ age是否大於或等於18,然後檢查$ age是否小於50. double ampersand,&&表示兩個語句必須如果打印出“你生命中最重要的程式碼”,那麼就應該執行,如果任何一個陳述由於某種原因而不是真的,那麼“你不是生命的巔峰”就會打印出來代替。當運算子優先順序很重要時,檢查條件的順序會有所不同。
除了&&之外,還有||這意味著OR。在這種情況下,如果檢查的任何條件為真,則整個語句被評估為true。
如果語句為真,則要執行的程式碼在其自己的塊中,否則要執行的程式碼在else塊中。這會阻止php嘗試執行true和false操作。
需要注意的一個關鍵點是php實踐“if語句短路”這是php將盡可能少的條件工作,所以它基本上停止檢查條件語句,只要它確定它可以停止。
For example
如果將$ age評估為8,則第一次檢查($ age> 10)將失敗,因此php將不會對20進行檢查。這意味著您可以檢查變數是否已設定以及是否設定為某個值 - 如果如果沒有設定變數,php將短路if語句而不檢查其值。這很好,因為如果你檢查一個unset變數的值,php會標記一個錯誤。
if語句的一個有用的補充是elseif語句,它允許您以更智慧的方式將條件連結在一起。
您可以使用if語句實現相同的效果,但使用elseif更容易閱讀。該系統的缺點是$ age變數需要多次檢查。
當你有一系列條件在上面的例子中都是相同的變數時,你的if ... elseif塊會變得難以處理。 php有一個解決方案,這是一個switch case語句。在switch case塊中,指定要檢查的內容,然後列出要處理的可能值。使用switch / case語句,我們可以像這樣重寫前面的指令碼:
Switch / case語句經常用於檢查各種資料,並且它們佔用的空間比等同的if語句少得多。
php switch / case語句程式碼中有兩個重要的注意事項。首先,預設情況下沒有單詞大小寫,這就是語言的工作原理。其次,我們上面的每個案例行動都以“休息”結束。這是因為一旦php在其案例列表中找到匹配項,它將執行該匹配項的操作以及其下所有匹配項的操作。
如果php在其他一種情況下沒有找到匹配項,或者如果它之前的情況被執行並且沒有以break語句結束,則執行預設情況。
關鍵字break意味著“退出switch / case語句”,並具有阻止php在匹配後執行所有後續情況的操作的效果。
PHP有以下迴圈關鍵字,foreach,while,for和do ... .while。
foreach迴圈用於處理陣列,並通過迭代陣列中的每個元素來工作。您也可以將它用於物件,在這種情況下,它會迭代該物件的每個公共變數。
foreach最基本的用法只提取每個陣列元素的值,如下所示:
這裡陣列$ array迴圈遍歷,其值被提取到$ val。在這種情況下,陣列鍵被完全忽略,這通常在自動生成時最有意義。
您也可以使用foreach來提取金鑰,如下所示:
使用物件時,語法是相同的:
PHP,while迴圈僅用於執行程式碼塊,只要給定條件為真。例如,此程式碼將從1迴圈到10,隨時打印出值。
請注意,同樣,php使用程式碼塊來表示迴圈的範圍,而迴圈以一個開括號{並以一個右括號(})結束,以清楚地告訴php它應迴圈通過哪些程式碼行。
與if語句一樣,您可以在迴圈中放置您選擇的任何條件,但是每次迴圈更改條件的值至關重要;否則,迴圈將永遠執行。雖然迴圈最常用於遞增列表,其中迴圈的迭代次數沒有已知限制。
更常見的迴圈形式是for迴圈,稍微複雜一些。 for迴圈由宣告,條件和動作組成,宣告是宣告迴圈計數器變數並設定為字串值的條件,條件是根據值檢查迴圈計數器變數的位置,動作是在每次迭代結束時應該發生什麼來改變迴圈計數器。
這是一個for迴圈的例子,它在php中的樣子。
如您所見,for迴圈有三個部分用分號分隔。在宣告中,我們將變數$ i設定為1.對於條件,如果$ i小於10,我們有迴圈執行。最後,對於動作,我們為每個迴圈迭代的$ i的值加1 - 也就是說,每次執行迴圈程式碼。
執行時,此指令碼將從1到10計數,沿途輸出文字。請注意,它實際上不會輸出數字10,因為我們指定$ i必須小於10,不小於或等於它。
儘管php提供了大量的函式來執行各種任務,但您仍需要在需要時建立自己的函式。如果您發現自己反覆做同樣的事情,或者想要跨專案共享程式碼,那麼使用者函式就適合您。
您可以為您的函式提供您喜歡的任何名稱,它們遵循與沒有$符號的php變數相同的指導。您可能無法重新定義PHP的內建函式名稱不會與現有PHP函式發生衝突 - 僅僅因為您沒有可用的imagepng()函式,這並不意味著其他人也不會。
PHP中最簡單的使用者函式看起來像這樣:
使用function關鍵字定義函式,然後是函式名稱和兩個括號。函式的實際程式碼將在大括號之間執行。在函式定義之後,我們可以像處理任何其他函式一樣處理foo(),如第5行所示,我們打印出它返回的值。
您可以從函式返回一個值,並使用return語句執行此操作。你可以返回你想要的任何變數,只要它只是一個變數,它可以是整數,字串,資料庫連線等.return關鍵字將函式返回值設定為你使用它的任何變數,然後立即存在該功能。你也可以使用return;這意味著“退出而不返回值。”如果您嘗試為變數分配沒有返回值的函式的返回值。您的變數將設定為NULL。
請考慮以下宣告:
這將輸出In函式,後跟1,然後指令碼將終止。我們從未看到離開函式的原因是因為行返回1後退然後立即退出 - 如果永遠不會達到foo(),則返回第二個print語句。
您可以通過修改定義以包含任意數量的引數來設計接受引數的函式。您需要為每個引數指定用於在函式內部引用它的名稱 - 當您稍後呼叫該函式時,PHP會將它接收的值複製到這些引數中,如下所示:
執行指令碼後,$ mynum將被設定為50. multiply()函式可能已被重寫,因此只有一行:返回$ a * $ b,但最好表明你可以使你的函式成為只要你願意
當涉及到引用時,事情變得更復雜,因為您需要能夠通過引用接受引數並且還通過引用返回值。這是通過參考運算子&完成的。
使引數“通過引用傳遞”在函式定義中完成,而不是在函式呼叫中完成,即:
is correct, whereas
這個是錯的。這意味著如果您在專案中多次使用某個函式,則只需編輯函式定義以使其通過引用獲取變數。通過引用傳遞通常是使指令碼更短且更易於閱讀的好方法 - 選擇很少由效能考慮因素驅動。
與通過引用傳遞值不同,您在函式定義中指定引數的引用性質,要返回引用,您需要在定義和呼叫時指定此類。要指定函式應返回引用,請將&符號引用運算子放在函式名稱之前,並指定您希望引用函式的結果而不是複製它,使用之前學過的正常引用賦值。
這是看起來如何:
在設計函式時,為未傳遞的引數指定預設值通常很有幫助。 PHP為其大多數功能執行此操作,並且如果它們通常是相同的,它可以節省您必須在大多數時間傳遞引數。
要為函式定義自己的預設引數,請在變數後新增要設定的常量值,如下所示:
現在,考慮這個功能:
這並不意味著$ FirstName和$ LastName都應設定為Smith。相反,只有$ LastName獲取值 - PHP將這兩個變數視為在功能上彼此獨立,這意味著您可以使用如下程式碼:
因此,為了迎接三個名叫約翰史密斯,湯姆戴維斯和湯姆史密斯的人,你會使用這個程式碼:
如果你想問一個名叫John Wilson的人,理想情況下你會讓PHP為你填寫第一個引數,因為John是該函式的預設引數,你會提供Wilson部分。但是如果你嘗試這樣的程式碼,你會發現它不起作用:
而不是約翰威爾遜,你將獲得威爾遜史密斯 - PHP將假設您提供的引數是第一個名稱,因為它從左到右填充其引數。相同的邏輯規定您不能在非預設值之前放置預設值,如下所示:
如果有人使用doHello(“Peter”),他們是否會嘗試為$ FirstName提供一個值來代替預設值,或者他們想要那裡的預設值和Peter的$ LastName嗎?希望您能看到為什麼PHP會在嘗試此操作時標記錯誤!PHP語言