PHP學習記錄2
PHP if...else...elseif 語句.
在 PHP 中,我們可以使用以下條件語句:
· if 語句- 如果指定條件為真,則執行程式碼
· if...else 語句- 如果條件為 true,則執行程式碼;如果條件為 false,則執行另一端程式碼
· if...elseif....else 語句- 選擇若干段程式碼塊之一來執行
· switch 語句- 語句多個程式碼塊之一來執行
<?php header("Content-type:text/html;charset=utf-8"); //設定編碼 $sun=150; if($sun>200){ echo"滿足條件1"; }elseif($sun<180){ echo "滿足條件2"; }else{ echo "都不滿足條件"; } ?>
switch...case的語法結構如下:
switch (expr)
{
case expr1:
statement;
break;
case expr2:
statement;
break;
……
default:
statement;
}
switch 語句類似於具有同一個表示式的一系列 if 語句
每個case會依次判斷,expr與expr1..n是否相等,如果相等則執行對應的statement,如果最後有break,則執行完成後跳出switch語句
default是在所有case都無法滿足的情況下預設執行的操作
注意事項:
1.不要在case 後面寫成分號,後面是冒號:
2.不要在case後面寫判斷區間,如($foo > 20 或者 $foo == 30)
3.switch裡面在變數最好是 整型,字串,因為布林判斷更適合if...else..
4.如果把每個case裡的break去掉,那麼每個case裡的程式碼塊會依次都執行到
5.switch語句可以不寫default,但是作為好的習慣,建議保留default語句
<?php header("Content-type:text/html;charset=utf-8"); //設定編碼 $dir='north'; switch ($dir) { case 'west': echo '西'; break; case 'east': echo '東'; break; case 'north': echo '北'; break; case 'sourth': echo '南'; break; default: echo '未知'; break; }
<?php header("Content-type:text/html;charset=utf-8"); //設定編碼 //得到今天是星期幾的英文簡稱 $day = date('D'); switch($day){ //拿學校舉例,我們讓星期一、二、三是校長日 case 'Mon': case 'Tue': case 'Wed': echo '校長日'; break; case 'Thu': echo '星期四'; break; case 'Fri': echo '星期五'; break; default: echo '週末,週末過的比周一到週五還要累<br />'; }
陣列
陣列可以存入多個不同型別的資料,是一個複合資料型別。
我們可以使用array()來初始化陣列,每個陣列元素之間使用逗號分隔
在PHP5.4版本之後,陣列的初始化更為簡潔,用中括號 [] 來初始化
我們來建立一個簡單的陣列
<?php header("Content-type:text/html;charset=utf-8"); //設定編碼 $array=array(100,1.34,true,"PHP中文網",); echo '<pre>';//<pre>pre 元素可定義預格式化的文字。被包圍在 pre //元素中的文字通常會保留空格和換行符。 var_dump($array); echo '<pre/>'; ?>
我們對著程式執行的結果看一下:
1. array(size = 4) 說明裡面有4個元素
2. 0 => int 100我們知道int是整型的意思,100是一個整型的數值。那前面的0,1,2,3和=>代表什麼意思呢?
3. 最新前的0,1,2,3代表的是值的讀取標識號,我們稱之為下標或者鍵(英文:key)
4. => 是一個符號標準叫法叫作:鍵值對應符。因此,以後再看到 0=> int 1 可以這樣來說。 下標訪問符0對應整型的1。
5. 我們還稱數組裡面的鍵值對為元素,元素就是鍵值對的組合。
通過上例,我們就完成了陣列其中的一種宣告方式:索引陣列的宣告。所謂索引陣列:就是下標全為整型的陣列。
索引陣列若不強制宣告他的下標,他的下標是從0開始的。(我們的第一個陣列的值:只有不斷努力才能博得未來。這個值的下標為0)。
2. 如果我指定過下標他的下標就為我指定的值。如下標為5,10和下標為19的,都是我指定過的值。
3. 若某個值(如php.cn),強制指定了下標(下標為10)。在它後面加上的值(PHP學院),不指定下標的話。他們的下標增
長規律為最大值+1。
<?php header("Content-type:text/html;charset=utf-8"); //設定編碼 $kele = array(5=>'只有不斷努力才能博得未來',10 => 'php.cn', 'PHP中文網' ,'好好學習哦', 19 => '去PHP中文網學習PHP'); //列印顯示$kele echo '<pre>'; var_dump($kele); echo '</pre>'; ?>
關聯陣列
索引陣列適當的變一下形就出現了關聯陣列。只要數組裡面有一個為字串的陣列,就為關聯陣列。
那我們來宣告一下關聯陣列。跟索引陣列的宣告方式完成一樣。不過不同的是,必須要指定字串的下標和必須要使用鍵值對應符。
<?php $arr=[ //用[]建立陣列 'name'=>'Tom', 'age'=>'18', 'gender'=>'male' ]; echo "<pre>"; var_dump($arr) ; echo"</pre>" ?>
我們通過實驗知道:
1. 宣告關聯陣列是 鍵名 => 值
2. 在關聯陣列可以有索引陣列的元素
陣列是我們最常用到的型別,那如何計算某個一維陣列的個數呢。其實我們可以用到我們之前學過的數學函式裡面的一個:count()。
count($變數) 函式用於返回陣列的長度(元素數):
<?php $name=Array('tom','andy','jack'); $namae=Array('tom','andy','jack',Array('1','a')); echo count($name);//3 echo '<br>'.count($namae);//4 ?>
用for迴圈遍歷索引陣列
遍歷二字,從字面解釋就是一個接一個全讀訪問一次,顯示出來。
因為for迴圈是一個單純的計數型迴圈,而索引陣列的下標為整型的數值。因此,我們可以通過for迴圈來遍歷索引陣列。
<?php $arr=Array('tom','andy','jack'); $arrlength=count($arr); for($x=0;$x<$arrlength;$x++){ echo $arr[$x]; echo "<br/>"; } ?>
那麼問題來了:
那關聯陣列怎麼辦? 如果索引陣列的下標不連續怎麼辦?
這就要用到我們下面所學的知識了。
foreach的基本語法
有一個布林型迴圈是專門用來迴圈陣列的。這個迴圈的基本語法就是foreach基本語法
foreach( 要迴圈的陣列變數 as [鍵變數 =>] 值變數){
//迴圈的內容
}
這是一個固定用法,將要迴圈的陣列放進去。
as 是一個固定的關鍵字
後面的鍵變數是可選的,隨意定義一個變數,每次迴圈的時候,foreach這個語法會把鍵取出來賦值到鍵變數裡面
後面的值變數是必填的。每次迴圈的時候,會把值放到值變數裡面。
<?php $arr=[ 'name'=>'Tom', 'age'=>'18', 'gender'=>'male' ]; foreach($arr as $k=>$v){ echo $k.": ".$v."<br />"; //其實就是把arr陣列中的每個鍵賦值給k,再把每個值賦值給v
/*
1. 每次迴圈的時候,把下標賦值給了變數$key,把值的變數賦值給了變數$value
2. 迴圈一次讀一次鍵和值。讀到最後,發現沒有可以讀取的陣列元素後,停止迴圈遍歷資料。
*/
}; ?>
對於關聯陣列
<?php header("Content-type:text/html;charset=utf-8"); //設定編碼 $data = array( 0 => '中國', 100 => '美國', 20 => '韓國', 300 => '德國', ); foreach($data as $k => $v){ echo $k . '------' . $v .'<br />'; } ?>
按照foreach的結果推理與剛剛做的關聯陣列的結果是一樣的。
不同的是不連續的索引陣列。每讀一次陣列的元素,將當次迴圈的下標賦值給了變數$k,值賦值給了變數$v。每讀將鍵和值輸
出,然後顯示出來。迴圈一次向後移動一次下標。讀取至最後,退出執行。
PHP 陣列排序
陣列中的元素可以按字母或數字順序進行降序或升序排列。
升序:從小到大的順序進行排序,如果是英文單詞,那麼按字母A-Za-z的順序排序,如果是數字,那麼按數字的大小進行排序。
降序:與升序相反
陣列排序函式
在本章中,我們將一一介紹下列 PHP 陣列排序函式:
· sort() - 對陣列進行升序排列
· rsort()- 對陣列進行降序排列
· asort() - 根據關聯陣列的值,對陣列進行升序排列
· ksort() - 根據關聯陣列的鍵,對陣列進行升序排列
· arsort() - 根據關聯陣列的值,對陣列進行降序排列
· krsort() - 根據關聯陣列的鍵,對陣列進行降序排列
sort()函式
注:sort大多是用來排序數字索引陣列的,如果把一個關聯陣列放到sort裡排序,那麼陣列的鍵會丟失
PHP 迴圈 - While 迴圈
PHP 迴圈
在您編寫程式碼時,經常需要反覆運行同一程式碼塊。我們可以使用迴圈來執行這樣的任務,而不是在指令碼中新增若干幾乎相等的程式碼行。
在 PHP 中,我們有以下迴圈語句:
· while- 只要指定條件為真,則迴圈程式碼塊
· do...while- 先執行一次程式碼塊,然後只要指定條件為真則重複迴圈
· for- 迴圈程式碼塊指定次數
· foreach- 遍歷陣列中的每個元素並迴圈程式碼塊
PHP while 迴圈
while是一個布林型迴圈,while(布林判斷)的值為true就執行大括號括起來的程式碼。如果為假就停出去,執行後續程式碼。
PHP do...while 迴圈
do...while與while的區別是,它們的值的檢查時機不同。
do-while 不論while判斷是否成立,先執行一次程式碼程式碼塊迴圈語句,保證會執行一次(表示式的真值在每次迴圈結束後檢查)。
然而我們上面的while迴圈會檢查布林判斷區域,成立則執行。不成立則不執行。
PHP 迴圈 - For 迴圈
For 迴圈
for 迴圈是 PHP 中的一種計數型迴圈,它的語法比較數活多變。
語法
for(表示式1,表示式2,表示式3){
需要執行的程式碼
}
· 表示式1 是初始化賦值,可以同時賦值多個程式碼。
· 表達示2 在每次迴圈開始前求值。如果值為 TRUE,則繼續迴圈,執行巢狀的迴圈語句。如果值為 FALSE,則終止迴圈。
· 表達示3 在每次迴圈之後被求值。
PHP 全域性變數 - 超全域性變數
超全域性變數 在 PHP 4.1.0 中引入,是在全部作用域中始終可用的內建變數。
PHP 全域性變數 - 超全域性變數
PHP 中的許多預定義變數都是“超全域性的”,這意味著它們在一個指令碼的全部作用域中都可用。在函式或方法中無需執行 global
$變數名; 就可以訪問它們。
PHP 超級全域性變數列表:
·$GLOBALS
· $_SERVER
· $_REQUEST
· $_POST
· $_GET
· $_FILES
· $_ENV
· $_COOKIE
· $_SESSION
$GLOBALS 是一個包含了全部變數的全域性組合陣列。變數的名字就是陣列的鍵。
$_SERVER 是一個包含了諸如頭資訊(header)、路徑(path)、以及指令碼位置(script locations)等等資訊的陣列。這個陣列中的專案由 Web 伺服器建立。不能保證每個伺服器都提供全部專案;伺服器可能會忽略一些,或者提供一些沒有在這裡列舉出來的專案。
<?php echo $_SERVER['PHP_SELF']; echo "<br>"; echo $_SERVER['SERVER_NAME']; echo "<br>"; echo $_SERVER['HTTP_HOST']; echo "<br>"; echo $_SERVER['HTTP_REFERER']; echo "<br>"; echo $_SERVER['HTTP_USER_AGENT']; echo "<br>"; echo $_SERVER['SCRIPT_NAME']; ?>
元素/程式碼 | 描述 |
$_SERVER['PHP_SELF'] |
當前執行指令碼的檔名,與 document root 有關。例如,在地址為 http://example.com/test.php/foo.bar 的指令碼中使用 $_SERVER['PHP_SELF'] 將得到 /test.php/foo.bar。__FILE__ 常量包含當前(例如包含)檔案的完整路徑和檔名。 從 PHP 4.3.0 版本開始,如果 PHP 以命令列模式執行,這個變數將包含指令碼名。之前的版本該變數不可用。 |
$_SERVER['GATEWAY_INTERFACE'] | 伺服器使用的 CGI 規範的版本;例如,"CGI/1.1"。 |
$_SERVER['SERVER_ADDR'] | 當前執行指令碼所在的伺服器的 IP 地址。 |
$_SERVER['SERVER_NAME'] |
當前執行指令碼所在的伺服器的主機名。如果指令碼運行於虛擬主機中,該名稱是由那個虛擬主機所設定的值決定。(如: www.php.cn) |
$_SERVER['SERVER_SOFTWARE'] | 伺服器標識字串,在響應請求時的頭資訊中給出。(如:Apache/2.2.24) |
$_SERVER['SERVER_PROTOCOL'] | 請求頁面時通訊協議的名稱和版本。例如,"HTTP/1.0"。 |
$_SERVER['REQUEST_METHOD'] | 訪問頁面使用的請求方法;例如,"GET", "HEAD","POST","PUT"。 |
$_SERVER['REQUEST_TIME'] |
請求開始時的時間戳。從 PHP 5.1.0 起可用。 (如:1377687496) |
$_SERVER['QUERY_STRING'] | query string(查詢字串),如果有的話,通過它進行頁面訪問。 |
$_SERVER['HTTP_ACCEPT'] | 當前請求頭中 Accept: 項的內容,如果存在的話。 |
$_SERVER['HTTP_ACCEPT_CHARSET'] | 當前請求頭中 Accept-Charset: 項的內容,如果存在的話。例如:"iso-8859-1,*,utf-8"。 |
$_SERVER['HTTP_HOST'] | 當前請求頭中 Host: 項的內容,如果存在的話。 |
$_SERVER['HTTP_REFERER' |
引導使用者代理到當前頁的前一頁的地址(如果存在)。由 user agent 設定決定。並不是所有的使用者代理都會設定該項,有的還提供了修改 HTTP_REFERER 的功能。簡言之,該值並不可信。) |
$_SERVER['HTTPS'] | 如果指令碼是通過 HTTPS 協議被訪問,則被設為一個非空的值 |
$_SERVER['REMOTE_ADDR'] | 瀏覽當前頁面的使用者的 IP 地址。 |
$_SERVER['REMOTE_HOST'] |
瀏覽當前頁面的使用者的主機名。DNS 反向解析不依賴於使用者的 REMOTE_ADDR。 |
$_SERVER['REMOTE_PORT'] | 使用者機器上連線到 Web 伺服器所使用的埠號。 |
$_SERVER['SERVER_ADMIN'] |
該值指明瞭 Apache 伺服器配置檔案中的 SERVER_ADMIN 引數。如果指令碼執行在一個虛擬主機上,則該值是那個虛擬主機的值。(如:[email protected]) |
$_SERVER['SERVER_PORT'] |
Web 伺服器使用的埠。預設值為 "80"。如果使用 SSL 安全連線,則這個值為使用者設定的 HTTP 埠。 |
$_SERVER['SERVER_SIGNATURE'] | 包含了伺服器版本和虛擬主機名的字串。 |
$_SERVER['PATH_TRANSLATED'] |
當前指令碼所在檔案系統(非文件根目錄)的基本路徑。這是在伺服器進行虛擬到真實路徑的映像後的結果。 |
$_SERVER['SCRIPT_NAME'] |
包含當前指令碼的路徑。這在頁面需要指向自己時非常有用。__FILE__ 常量包含當前指令碼(例如包含檔案)的完整路徑和檔名。 |
PHP $_REQUEST 用於收集HTML表單提交的資料。
<html> <body> <form method="post" action="<?php echo $_SERVER['PHP_SELF'];?>"> Name: <input type="text" name="fname"> <input type="submit"> </form> <?php $name = $_REQUEST['fname']; echo $name; ?> </body> </html>
例項顯示了一個輸入欄位(input)及提交按鈕(submit)的表單(form)。 當用戶通過點選 "Submit" 按鈕提交表單資料時, 表單資料將傳送至<form>標籤中 action 屬性中指定的指令碼檔案。 在這個例項中,我們指定檔案來處理表單資料。如果你希望其他的PHP檔案來處理該資料,你可以修改該指定的指令碼檔名。 然後,我們可以使用超級全域性變數 $_REQUEST 來收集表單中的input 欄位資料:
在輸入框裡輸入資料,提交查詢
小提示:action:我們可以給他指定提交到某個檔案下,例如action="app.php",
上面 的例子因為我們不想在建立一個php檔案,所以這段話<?php echo
$_SERVER['PHP_SELF'];?>的意思是提交到自己的頁面
$_POST 變數用於收集來自 method="post" 的表單中的值
使用超級全域性變數 $_POST 來收集表單中的 input 欄位資料:
<html> <body> <form method="post" action="<?php echo $_SERVER['PHP_SELF'];?>"> Name: <input type="text" name="name"> Age :<input type="text" name="age"> <input type="submit"> </form> <?php $name = $_POST['name']; $age=$_POST['age']; echo $name ."<br/>"; echo $age; ?> </body> </html>
PHP $_GET 同樣被廣泛應用於收集表單資料
在HTML form標籤的指定該屬性:"method="get"。 從帶有 GET 方法的表單傳送的資訊,對任何人都是可見的(會顯示在瀏覽器的位址列),並且對傳送的資訊量也有限制(最多 100 個字元)。
PHP 魔術變數
PHP 向它執行的任何指令碼提供了大量的預定義常量。
不過很多常量都是由不同的擴充套件庫定義的,只有在載入了這些擴充套件庫時才會出現,或者動態載入後,或者在編譯時已經包括進去了。
有八個魔術常量它們的值隨著它們在程式碼中的位置改變而改變。
__LINE__ |
檔案中的當前行號。 |
__FILE__ |
檔案的完整路徑和檔名。如果用在被包含檔案中,則返回被包含的檔名。 自 PHP 4.0.2 起,__FILE__ 總是包含一個絕對路徑(如果是符號連線,則是解析後的絕對路徑),而在此之前的版本有時會包含一個相對路徑。 |
__DIR__ |
檔案所在的目錄。如果用在被包括檔案中,則返回被包括的檔案所在的目錄。 它等價於 dirname(__FILE__)。除非是根目錄,否則目錄中名不包括末尾的斜槓。(PHP 5.3.0中新增) |
__FUNCTION__ |
函式名稱(PHP 4.3.0 新加)。自 PHP 5 起本常量返回該函式被定義時的名字(區分大小寫)。在 PHP 4 中該值總是小寫字母的。 |
__CLASS__ |
類的名稱(PHP 4.3.0 新加)。自 PHP 5 起本常量返回該類被定義時的名字(區分大小寫) |
__TRAIT__ |
Trait 的名字(PHP 5.4.0 新加)。自 PHP 5.4.0 起,PHP 實現了程式碼複用的一個方法,稱為 traits。 |
__METHOD__ |
類的方法名(PHP 5.0.0 新加)。返回該方法被定義時的名字(區分大小寫)。 |
__NAMESPACE__ |
當前名稱空間的名稱(區分大小寫)。此常量是在編譯時定義的(PHP 5.3.0 新增)。 |
PHP 名稱空間(namespace)
PHP 名稱空間(namespace)是在PHP 5.3中加入的
什麼是名稱空間?從廣義上來說,名稱空間是一種封裝事物的方法。在很多地方都可以見到這種抽象概念。例如,在作業系統中目
錄用來將相關檔案分組,對於目錄中的檔案來說,它就扮演了名稱空間的角色。具體舉個例子,檔案 foo.txt 可以同時在目
錄/home/greg 和 /home/other 中存在,但在同一個目錄中不能存在兩個 foo.txt 檔案。另外,在目錄 /home/greg 外訪問
foo.txt 檔案時,我們必須將目錄名以及目錄分隔符放在檔名之前得到 /home/greg/foo.txt。這個原理應用到程式設計領域就是名稱空間、
PHP 名稱空間可以解決以下兩類問題:
1. 使用者編寫的程式碼與PHP內部的類/函式/常量或第三方類/函式/常量之間的名字衝突。
2. 為很長的識別符號名稱(通常是為了緩解第一類問題而定義的)建立一個別名(或簡短)的名稱,提高原始碼的可讀性。
定義名稱空間
預設情況下,所有常量、類和函式名都放在全域性空間下,就和PHP支援名稱空間之前一樣。
名稱空間通過關鍵字namespace 來宣告。如果一個檔案中包含名稱空間,它必須在其它所有程式碼之前宣告名稱空間。
在宣告名稱空間之前唯一合法的程式碼是用於定義原始檔編碼方式的 declare 語句。另外,所有非 PHP 程式碼包括空白符都不能出現在名稱空間的宣告之前:
單個檔案中定義多個名稱空間。建議使用下面的大括號形式的語法。
<?php
declare(encoding='UTF-8'); //定義多個名稱空間和不包含在名稱空間中的程式碼 namespace MyProject { const CONNECT_OK = 1; class Connection { /* ... */ } function connect() { /* ... */ } } namespace AnotherProject { const CONNECT_OK = 1; class Connection { /* ... */ } function connect() { /* ... */ } } ?>
將全域性的非名稱空間中的程式碼與名稱空間中的程式碼組合在一起,只能使用大括號形式的語法。全域性程式碼必須用一個不帶名稱的 namespace 語句加上大括號括起來,例如:
<?php namespace MyProject { const CONNECT_OK = 1; class Connection { /* ... */ } function connect() { /* ... */ } } namespace { // 全域性程式碼 session_start(); $a = MyProject\connect(); echo MyProject\Connection::start(); } ?>
子名稱空間
與目錄和檔案的關係很像,PHP 名稱空間也允許指定層次化的名稱空間的名稱。因此,名稱空間的名字可以使用分層次的方式定義:
<?php namespace MyProject\Sub\Level; //宣告分層次的單個名稱空間 const CONNECT_OK = 1; class Connection { /* ... */ } function Connect() { /* ... */ } ?>
上面的例子建立了常量 MyProject\Sub\Level\CONNECT_OK,類 MyProject\Sub\Level\Connection 和函式 MyProject\Sub\Level\Connect。
名稱空間使用
PHP 名稱空間中的類名可以通過三種方式引用:
-
非限定名稱,或不包含字首的類名稱,例如 $a=new foo(); 或 foo::staticmethod();。如果當前名稱空間是 currentnamespace,foo 將被解析為 currentnamespace\foo。如果使用 foo 的程式碼是全域性的,不包含在任何名稱空間中的程式碼,則 foo 會被解析為foo。 警告:如果名稱空間中的函式或常量未定義,則該非限定的函式名稱或常量名稱會被解析為全域性函式名稱或常量名稱。
-
限定名稱,或包含字首的名稱,例如 $a = new subnamespace\foo(); 或 subnamespace\foo::staticmethod();。如果當前的名稱空間是 currentnamespace,則 foo 會被解析為 currentnamespace\subnamespace\foo。如果使用 foo 的程式碼是全域性的,不包含在任何名稱空間中的程式碼,foo 會被解析為subnamespace\foo。
-
完全限定名稱,或包含了全域性字首操作符的名稱,例如, $a = new \currentnamespace\foo(); 或 \currentnamespace\foo::staticmethod();。在這種情況下,foo 總是被解析為程式碼中的文字名(literal name)currentnamespace\foo。