網路程式設計/PHP
資源
PHP(代表 PHP Hypertext Preprocessor)是一種用於處理網路請求的程式語言。當您使用瀏覽器請求或獲取網頁時,您向伺服器傳送了一個請求。網路伺服器知道如何使用 URL 找到檔案並將其傳送回您的瀏覽器。PHP 允許我們在網路伺服器上建立程式,當請求程式時,伺服器會將程式的輸出作為響應傳送。要使這能夠正常工作,網路伺服器必須知道如何處理 PHP 檔案。大多數網路伺服器都安裝了 PHP 模組,當它們看到對 PHP 檔案的請求時,它們會將請求轉發到 PHP 模組。PHP 模組將解析請求引數並呼叫請求的 PHP 程式碼。
這是一個強大的想法。使用 PHP,您可以在網路伺服器上建立程式,這些程式可以動態地使用來自檔案、資料庫或其他網路服務的各種資料來源來建立網頁。即使它是在網路客戶端-伺服器模型之上的一個簡單的請求-響應模型,我們也可以透過將複雜的互動分解為一系列請求-響應週期來建立強大的網路應用程式。
PHP 是一種指令碼語言。我們建立我們的程式作為文字檔案,這些文字檔案也是可執行檔案。當程式執行時,PHP 直譯器會讀取原始碼/可執行檔案並一次執行一行程式碼。您可以在伺服器上使用直譯器測試您的 PHP 程式碼,方法如下
$php my_php_code.php
在 PHP 檔案中,您可以混合 PHP 程式碼和靜態內容。當檔案執行時,只有 PHP 程式碼會被執行。程式碼的輸出替換程式碼部分,形成程式的輸出,靜態內容保持不變。這種設計使使用模板生成網頁並向頁面部分注入動態內容變得容易。
一個 PHP 程式碼塊 使用標籤定義,如示例所示
<!DOCTYPE html>
<html>
<body>
<h1>My hello world page</h1>
<?php
echo "Hello World!";
?>
</body>
</html>
請檢視 w3schools.com 上的以下教程以學習基本的 PHP 語法
<html>
<head>
<title>My TODO list</title>
</head>
<body>
<ul>
<?php
$todos = array("Buy milk", "Buy eggs", "Read a book");
$todo_count = 3;
for ($i=0; $i<$todo_count; $i++){
echo "<li>".$todos[$i]."</li>\n";
}
?>
</ul>
</body>
</html>
前面 PHP 指令碼生成的 HTML 如下所示
<html>
<head>
<title>My TODO list</title>
</head>
<body>
<ul>
<li>Buy milk</li>
<li>Buy eggs</li>
<li>Read a book</li>
</ul>
</body>
</html>
縮排不是我們預期的,我們可以從 PHP 指令碼中列印空格或製表符,但這將非常繁瑣。相反,我們可以使用表示式塊將動態內容注入到靜態內容中,如以下示例所示。
<html>
<head>
<title>My TODO list</title>
</head>
<body>
<ul>
<?php
$todos = array("Buy milk", "Buy eggs", "Read a book");
$todo_count = 3;
for ($i=0; $i<$todo_count; $i++){?>
<li><?=$todos[$i]?></i>
<?php }
?>
</ul>
</body>
</html>
<html>
<head>
<title>My TODO list</title>
</head>
<body>
<ul>
<?php
$todos = file("todolist.txt");
$todo_count = count($todos);
for ($i=0; $i<$todo_count; $i++){
echo "<li>".$todos[$i]."</li>";
}
?>
</ul>
</body>
</html>
函式是可重用的程式碼塊。PHP 有一組內建的 字串函式 用於操作字串。部分字串函式列表如下
explode 函式允許我們將字串“解包”成一個子字串陣列。以下程式碼
<?php
$items = explode(":", "item1:item2:item3");
print_r($items);
?>
將輸出
Array
(
[0] => item1
[1] => item2
[2] => item3
)
您可以使用 list 標記命名子字串。以下程式碼
<?php
list($a, $b) = explode(":", "item1:item2:item3");
print "a=".$a."\n";
print "b=".$b;
?>
將輸出
a=item1
b=item2
implode 函式將字串陣列打包成一個字串。
Python 陣列 允許我們使用單個變數引用一組專案。這些專案可以是任何資料型別,包括陣列(如何建立多維陣列)。Python 陣列的大小不是固定的。事實上,有一些函式允許您將陣列視為佇列或列表。以下是一些示例陣列函式
- array()
- count()
- list()
- array_push()
- array_pop()
- array_slice()
- array_splice()
- array_shift()
- array_unshift()
- sort()
- rsort()
- 陣列函式的完整列表
PHP 超全域性變數 是一組預定義的變數,這些變數始終可供伺服器上的所有 PHP 指令碼訪問。
它們是
- $GLOBALS
- $_SERVER
- $_REQUEST
- $_POST
- $_GET
- $_FILES
- $_ENV
- $_COOKIE
- $_SESSION
以下指令碼
<?php
print_r($_SERVER);
?>
將輸出類似於以下內容
Array ( [HTTP_HOST] => 198.209.99.99 [HTTP_CONNECTION] => keep-alive [HTTP_CACHE_CONTROL] => max-age=0 [HTTP_ACCEPT] => text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 [HTTP_USER_AGENT] => Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.122 Safari/537.36 [HTTP_ACCEPT_ENCODING] => gzip,deflate,sdch [HTTP_ACCEPT_LANGUAGE] => en-US,en; ...
如您所見,伺服器透過傳送的 HTTP 請求從客戶端獲取各種資訊,並透過 $_SERVER 變數將其提供給 PHP 指令碼。
如果我們使用以下 URL 請求以下指令碼:http://host/path/to/test.php?first_name=Curious&last_name=George,指令碼將回顯透過此請求傳送的引數。
<?php
print_r($_REQUEST);
?>
實際輸出是
Array ( [first_name] => Curious [last_name] => George )
$_REQUEST 是一個關聯陣列,其索引為字串。您可以透過其名稱引用陣列中的元素,例如 $_REQUEST["first_name"] 將為您提供“Curious”的值。如果您希望透過查詢字串將引數傳送到您的指令碼,您可以嘗試透過此 $_REQUEST 變數獲取它。以下指令碼測試引數是否已傳送,如果查詢字串中未提供引數,則回顯“first_name 引數缺失”。
<?php
$first_name = $_REQUEST["first_name"];
if (isset($_REQUEST["first_name"])){
print "first_name=".$first_name;
}else{
print "first_name parameter is missing.";
}
PHP 檔案函式允許我們訪問和操作執行 PHP 指令碼的伺服器上的檔案系統。基本檔案函式包括從檔案或目錄讀取內容以及寫入檔案。一些常用的檔案函式如下
以下 PHP 指令碼從檔案讀取一首詩並將其輸出為有序列表。
<ol>
<?php
$lines = file("poem.txt");
foreach ($lines as $line){
?>
<li><?=$line?></li>
<?php
}
?>
</ol>
輸出將顯示在瀏覽器視窗中,如下所示
1. All that is gold does not glitter, 2. Not all those who wander are lost; 3. The old that is strong does not wither, 4. Deep roots are not reached by the frost. 5. From the ashes a fire shall be woken, 6. A light from the shadows shall spring; 7. Renewed shall be blade that was broken, 8. The crownless again shall be king.
讀取目錄類似於讀取檔案,只是結果是我們要讀取的目錄的檔案和目錄列表。glob 函式允許我們掃描目錄以讀取與模式匹配的專案(檔案或目錄)。以下指令碼讀取“word”子目錄中的文字檔名稱,該子目錄位於包含該指令碼的目錄下。
<?php
$file_names = glob("words/*.txt");
print_r($file_names);
?>
如以下輸出所示,glob 函式返回的陣列包含檔案的相對路徑,這使得讀取檔案(下一個示例)變得容易。
Array ( [0] => words/hits.txt [1] => words/words.txt )
下一個指令碼獲取檔案的路徑,讀取檔案內容,並將它們回顯給呼叫者。
<?php
$files = glob("words/*.txt");
foreach ($files as $file){
$content = file_get_contents($file);
?>
<h1><?=basename($file)?></h1>
<?=$content ?>
<?php
}
?>
指令碼的示例輸出如下所示。basename 函式返回路徑的最後一個元件,即“裸”檔名。
<h1>hits.txt</h1> 123 <h1>words.txt</h1> prothalamion noun a song in celebration of a marriage atrabilious adjective given to or marked by melancholy; GLOOMY hyacinth noun a precious stone of the ancients sometimes held to be the sapphire; a gem zircon or essonite
PHP 包含語句將另一個檔案的內容複製到包含語句出現的當前檔案中。例如,以下語句將“包含”navigation.php 指令碼的輸出(例如導航欄的 HTML 程式碼)到它自己的輸出中。
<?php include "navigation.php"; ?>