PHP 速成课程(5):需要、包含、文件操作和枚举

require 和 include

到目前为止,我们为所有测试只创建了一个 PHP 文件。

创建应用程序时,情况几乎总是相反。很快我们就需要将代码拆分/组织到多个文件中。

在这里,我们将看到两条指令,它们允许你执行已在另一个文件中定义的代码。

为此,我们将创建两个文件。第一个文件名为 message.php,并写入以下代码

1
2
3
4
5
6
<?php

function sendMessage(string $message)
{
echo $message . '<br>';
}

这是简单的代码。一个显示消息和换行符的小函数。

然后,创建第二个名为 index.php 的文件并写入以下代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
</head>

<body>
<?php
require 'message.php';
sendMessage('Hello World');
?>
</body>
</html>

在这个例子中,我们发现了 require 指令。它允许包含 message.php 文件的代码。因此允许使用函数 sendMessage()

如果指定为参数的文件不存在会发生什么?在这种情况下,PHP 将返回错误。

include 指令

允许你执行与 require 指令完全相同的操作,只是如果要包含的文件不存在,PHP 将不会返回错误(仅返回警告)。

require_once 和 include_once

这些指令与它们的姊妹函数(requireinclude)相同。不同之处在于,PHP 仅在文件尚未包含时才会包含该文件。

文件和文件夹的操作

PHP 包含几个函数来操作服务器上的文件夹和文件

这里有一些非常有用的函数

创建文件

1
file_put_contents("test.txt", "Hello World!");

此函数将创建 test.txt 文件(在当前文件夹中),内容为“Hello World”。

可以指定文件夹。

1
file_put_contents("data/test.txt", "Hello World!");

如果文件夹不存在,PHP 将返回警告

你可以使用 mkdir 函数创建文件夹

1
2
3
mkdir('data');

file_put_contents("data/test.txt", "Hello World!");

请注意,要删除文件夹,你可以使用 rmdir() 函数。文件夹必须为空才能删除。

如果你想在当前文件夹的父文件夹中创建文件,请使用双点 ../

1
file_put_contents("../test.txt", "Hello World!");

该文件将在父文件夹中创建

如果文件已存在,file_put_contents 函数将替换现有文件。如果你的目标是附加到现有文件,请使用 FILE_APPEND 选项

1
file_put_contents("test.txt", "Hello World!", FILE_APPEND);

读文件

1
$content = file_get_contents("test.txt");

如果文件不存在,PHP 将返回警告

要检查文件是否存在,你可以使用 file_exists() 函数

1
2
3
if (file_exists('/posts/first.txt')) {
// do some stuff
}

逐行读取文件

上一个函数允许一次读取一个文件。有一个函数可以逐行读取。

1
2
3
4
5
6
7
$file = fopen("test.txt", "r");

while(! feof($file)) {
$line = fgets($file);
echo $line. "<br>";
}
fclose($file);

这里使用 r 选项打开文件进行读取。

代码块将运行,直到检测到文件末尾 feof()

逐行写入文件

1
$file = fopen('export.csv', 'w');

这里使用 w 选项打开文件以创建或覆盖。如果我们想添加内容,可以使用选项 a 来添加

打开文件后,你可以插入行

1
2
3
4
5
6
7
8
9
10
11
12
13
$array = [
['name' => 'William', 'age' => 45],
['name' => 'John', 'age' => 38],
]

//Write key name as csv header
fputcsv($file, array_keys($array[0]));

//Write lines (format as csv)
foreach ($array as $row) {
fputcsv($file, $row);
}
fclose($file);

fputfile() 函数允许写入行。在这里,我们使用的是它的姊妹函数 fputcsv(),它本质上执行相同的操作,但采用 csv 格式。

请注意,我们在循环之前使用了 fputcsv。此行将是文件的第一行,应包含列名。array_keys() 函数允许你检索数组键的名称(名称和年龄)

枚举

枚举可以定义个性化的“类型”,该类型将限制为指定值中的可能值之一。枚举是一种对象类型,因此可以在任何可以使用对象的地方使用。

这是一个示例语句

1
2
3
4
5
6
7
// Définir le nom et les valeurs posssible
enum InvoiceStatus
{
case Sent;
case Paid;
case Cancelled;
}

此声明创建了一个只能有三个值的 InvoiceStatus 类型

InvoiceStatus::Sent

InvoiceStatus::Paid

InvoiceStatus::Cancel

可以在带有类型提示的函数中使用此类型

1
2
3
4
5
6
7
function printInvoiceStatus(InvoiceStatus $status)
{
print($status->name);
}

printInvoiceStatus(InvoiceStatus::Sent);
// Sent

name 属性用于检索案例的名称

可以为每个“案例”关联一个值。为此,在声明枚举时必须指定枚举的类型:例如枚举 InvoiceStatus : int

还可以向我们的枚举添加方法

1
2
3
4
5
6
7
8
enum InvoiceStatus : int
{
case Sent = 0;
case Paid = 1;
case Cancelled = 2;
}

print(InvoiceStatus::Paid->value);

value 属性允许你检索与 case 关联的值

就像对象一样,可以向 Enum 添加方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
enum InvoiceStatus : int
{
case Sent = 0;
case Paid = 1;
case Cancelled = 2;

public function text() : string
{
return match ($this) {
self::Sent => 'Sent',
self::Paid => 'Paid',
self::Cancelled => 'Cancelled'
};
}
}

function getInvoiceStatus(InvoiceStatus $status)
{
print($status->text());
print($status->value);
}

getInvoiceStatus(InvoiceStatus::Paid);
// Paid1

该方法可以通过关键字 self:: 访问枚举的 case

最后,每个值都可以调用 ex 函数。InvoiceStatus→text()


相关文章: