跳转到内容

网络编程/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"; ?>
华夏公益教科书