跳轉到內容

網路程式設計/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 程式碼會被執行。程式碼的輸出替換程式碼部分,形成程式的輸出,靜態內容保持不變。這種設計使使用模板生成網頁並向頁面部分注入動態內容變得容易。

一個 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 字串函式

[編輯 | 編輯原始碼]

函式是可重用的程式碼塊。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 函式將字串陣列打包成一個字串。

PHP 陣列函式

[編輯 | 編輯原始碼]

Python 陣列 允許我們使用單個變數引用一組專案。這些專案可以是任何資料型別,包括陣列(如何建立多維陣列)。Python 陣列的大小不是固定的。事實上,有一些函式允許您將陣列視為佇列或列表。以下是一些示例陣列函式

PHP 全域性變數

[編輯 | 編輯原始碼]

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 指令碼的伺服器上的檔案系統。基本檔案函式包括從檔案或目錄讀取內容以及寫入檔案。一些常用的檔案函式如下

以下 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 包含語句

[編輯 | 編輯原始碼]

PHP 包含語句將另一個檔案的內容複製到包含語句出現的當前檔案中。例如,以下語句將“包含”navigation.php 指令碼的輸出(例如導航欄的 HTML 程式碼)到它自己的輸出中。

<?php include "navigation.php"; ?>
華夏公益教科書