作者选择了 Open Sourcing Mental Illness Ltd作为 Write for Donations计划的一部分接受捐款。
介绍
当你发现自己在程序的不同部分中复制和粘贴代码块时,你已经准备好写一个函数. 如果你需要与变量的内容进行交互 - 更改案例,查找长度,切割或排序 - 可能有一个内置的函数。
函数停留,直到它被称为 called。当函数被调用时,它执行了函数中定义的任务。函数通常采取输入,执行操作,并返回结果输出。函数内部发生的操作建立了输入和输出之间的关系。在与函数进行交互时需要考虑的三个主要部分是输入、关系和输出。即使输入不是明确的,通常还有一些与代码的环境相关的暗示数据:日期、时间、系统、文件、行号等。
在本教程中,您将使用函数的所有不同部分,以便您能够以最佳方式使用函数来解决您的挑战。我们将从写用户定义函数开始。这些函数将澄清参数和参数之间的差异,通过值和参考传输变量,设置默认值,并使用类型声明来指定可接受的输入和输出类型。 通过理解 scope,您将能够操纵需要改变的代码的特定部分,而不影响其他部分。 一旦您了解函数的不同方面以及它们如何受到范围的影响,您将能够阅读和理解 PHP 提供的许多内置函数的文档。
用户定义功能
使用相同的代码写在多个地方,会使阅读和理解一个项目变得困难。编程的核心原则
或基本原则之一是不要重复自己
,通常被称为DRY编程
。
创建和召唤函数
编写函数时,必须首先构建函数的结构. 此代码块保持不变,直到它是 called 或 invoked. 一个函数是使用函数
的关键字加上一个选择的名称创建的,然后是注释。 函数的身体由弯曲的轴承包围,是执行该操作的代码:
1[label hello.php]
2<?php
3function hello() {
4 echo "Hello World!";
5}
这个名为你好
的函数停留,这意味着它什么也不做,直到函数被称为_called 之前,文件将没有输出。
1[label hello.php]
2<?php
3function hello() {
4 echo "Hello World!";
5}
6hello();
函数的呼叫是导致函数执行其操作的原因,在这种情况下,它会显示输出:
1[secondary_label Output]
2Hello World!
这个简单的例子不是一个函数的好用,因为没有任何输入,这意味着没有关系,只有输出。
1[label hello.php]
2<?php
3$hello = "Hello World!";
4echo $hello;
这两个行提供与函数和调用相同的结果:
1[secondary_label Output]
2Hello World!
让我们扩展示例函数以接受输入。
论点和参数
要创建一个构建输入和输出之间的关系的Hello
函数,该函数应该接受一些输入。
1[label hello.php]
2<?php
3function hello($name) {
4 echo "Hello ".$name;
5}
6hello();
函数Hello
现在接受一个参数,存储在变量$name
中,然后在函数的体内使用该变量,将字符串Hello
连接到字符串$name
变量中,使用字符串连接操作器。
1[secondary_label Output]
2Warning: Uncaught ArgumentCountError: Too few arguments to function hello(), 0 passed in php shell code on line 1 and exactly 1 expected
当呼叫你好
函数时,它需要使用一个参数作为输入,该参数设置了$name
的值。当它是函数定义的一部分时,使用了 parameter 术语,当它是函数呼叫的一部分时,使用了 argument 术语。
1[label hello.php]
2<?php
3function hello($name) {
4 echo "Hello ".$name;
5}
6hello("Sammy");
该函数现在可以使用该字符串输入来创建问候的输出。
1[secondary_label Output]
2Hello Sammy
这些基本参数被称为位置参数
,因为它们必须以函数定义的相同顺序传递。PHP不限制一个字节分开的参数数量,但函数只应该执行单个操作。
可选的默认值
默认情况下,该函数所定义的任何参数都需要在函数调用中传递一个参数,这使得我们的输出变得独一无二,而不是仅仅从变量中调用相同的数据。有时我们不需要所有参数的独一无二值;相反,如果函数调用不包含该参数,我们可以使用一个特定的值。
1[label hello.php]
2<?php
3function hello($name, $greeting = "Hello") {
4 echo $greeting." ".$name;
5}
6hello("Sammy", "Bonjour");
现在有一个名为$greeting
的第二个参数,然后在函数的体内使用该变量来改变输出的问候部分的值:
1[secondary_label Output]
2Bonjour Sammy
第一个参数「$name」没有默认值,因此必须在函数的每个调用中包含一个参数. 由于第二个参数具有默认值,因此该函数不需要传输第二个参数:
1[label hello.php]
2<?php
3function hello($name, $greeting = "Hello") {
4 echo $greeting." ".$name;
5}
6hello("Sammy");
当只通过一个参数时,$greeting
变量的值将设置为Hello
的默认值:
1[secondary_label Output]
2Hello Sammy
当要求的参数与同一函数中的可选参数一起使用时,所有要求的参数必须先于所有可选参数。
可选零值
当变量完全是可选的,不需要任何值时,默认值可以被定义为null
。
1[label hello.php]
2<?php
3function hello($name, $greeting = "Hello", $punctuation = null) {
4 echo $greeting." ".$name.$punctuation;
5}
6hello("Sammy");
变量 is 已被声明
,因此在函数体试图访问变量时不会出现错误,但变量被视为未设置
,因此不会添加任何额外的输出:
1[secondary_label Output]
2Hello Sammy
回归价值观
我们可能并不总是想打印函数的输出. 为了在函数中建立更多的灵活性,通常会将输出值返回到最初呼叫函数的代码中。
1[label hello.php]
2<?php
3function hello($name, $greeting = "Hello", $punctuation = null) {
4 return $greeting." ".$name.$punctuation;
5}
6hello("Sammy");
7echo hello("Sammy");
在第一个呼叫到你好
函数时,返回的值没有做任何事情,使它看起来好像没有发生任何事情,即使函数中的代码被执行了。
1[secondary_label Output]
2Hello Sammy
这些结果也可以存储在变量中或用作另一个函数的输入。
在函数内调用函数
函数是可重复使用的代码块. 可以写在函数之外的大多数代码也可以写在函数内部。 只是因为你可以,但是,并不意味着你应该。 你绝不应该在另一个函数中定义函数,除了一些非常先进的案例外。 但是,你会经常从另一个函数中调用一个函数。 为了指定输出问候的格式,你可以使用一些内置的函数:
1[label hello.php]
2<?php
3function hello($name, $greeting = "Hello", $punctuation = null) {
4 $name = ucwords(strtolower($name));
5 return $greeting." ".$name.$punctuation;
6}
7echo hello("SAMMY");
Hello
函数中的第一个行现在将某些格式化应用于$name
的值。首先,它将字符串转换为较低的字符串。strtolower
函数返回一个值,然后在第二个函数中立即使用,即ucwords
。这将每个单词的第一个字母转换为上面的字符串。
1[secondary_label Output]
2Hello Sammy
类型声明
PHP 是一个 https://en.wikipedia.org/wiki/Strong_and_weak_typing 语言,这意味着它会尝试将其给出的值转换为每个情况的适当类型,这可以产生令人惊讶的,有时不受欢迎的结果。
1[label hello.php]
2<?php
3function hello($name, $greeting = "Hello", $punctuation = null) {
4 $name = ucwords(strtolower($name));
5 return $greeting." ".$name.$punctuation;
6}
7echo hello(123);
PHP 没有任何问题 类型拼搏,它将整数 123
转换为字符串 `"123"',然后按照以前的做法进行:
1[secondary_label Output]
2Hello 123
那是有效的输出,但这也可能不是所需的结果吧. 让我们看看当我们通过一个(https://andsky.com/tech/tutorials/understanding-data-types-in-php#arrays)的数组时会发生什么。 stringtolower
函数会引发不同的错误;为此演示的目的,将添加到该行开头的双切片,以使其成为评论,从而跳过了该代码的执行:
1[label hello.php]
2<?php
3function hello($name, $greeting = "Hello", $punctuation = null) {
4 // $name = ucwords(strtolower($name));
5 return $greeting." ".$name.$punctuation;
6}
7echo hello(["Sammy", "World"]);
这一次,代码提供了通知,但并不非常清楚。此外,根据系统的设置,通知可能会被关闭或忽略,因为它们不会阻止代码的执行。
1[secondary_label Output]
2Notice: Array to string conversion in php shell code on line 2
3Hello Array
开发人员花费的阅读和调试比实际编写代码的时间要多得多,所以使我们编写的任何代码尽可能容易阅读和调试,从PHP 5开始,并且在PHP 7中得到更强大的支持,我们现在可以 declare 或指定函数输入和输出的可接受值类型。
参数类型声明
Parameter Type Declarations确保函数被调用时使用的参数值匹配指定的类型;否则,将丢弃TypeError。让我们将字符串类型添加到我们的$name
参数,然后再试试array
参数。
1[label hello.php]
2<?php
3function hello(string $name, $greeting = "Hello", $punctuation = null) {
4 $name = ucwords(strtolower($name));
5 return $greeting." ".$name.$punctuation;
6}
7echo hello(["Sammy", "World"]);
这次函数调用会导致一个例外,这会阻止代码的执行,所以我们无法获得有效的外观输出。
1[secondary_label Output]
2Warning: Uncaught TypeError: Argument 1 passed to hello() must be of the type string, array given
如果参数被更改为整数而不是数组,则可以合理地期望出现错误,因为参数只应该接受字符串值。
1[label hello.php]
2<?php
3function hello(string $name, $greeting = "Hello", $punctuation = null) {
4 $name = ucwords(strtolower($name));
5 return $greeting." ".$name.$punctuation;
6}
7echo hello(123);
代替扔错误,再一次将整数
转换为没有问题的字符串
,并执行函数:
1[secondary_label Output]
2Hello 123
PHP 仍然在整数上执行类型拼写以将其转换为字符串,然后继续执行。
严格的类型
阻止PHP进行类型调试
可以帮助使代码更容易阅读和调试。PHP为我们提供一种方式,以每个文件为基础声明严格类型。
1[label hello.php]
2<?php
3declare(strict_types=1);
4function hello(string $name, $greeting = "Hello", $punctuation = null) {
5 $name = ucwords(strtolower($name));
6 return $greeting." ".$name.$punctuation;
7}
8echo hello(123);
在将声明行添加到文件的顶部后,PHP在通过整数
而不是字符串
时会产生错误:
1[secondary_label Output]
2PHP Fatal error: Uncaught TypeError: Argument 1 passed to hello() must be of the type string, int given.
<$>[注]
注: 交互式壳不允许您声明strict_types
。
零类型
我们也可以将你好
函数的第二参数声明为字符串,因为它具有默认值,所以不需要参数,但如果一个参数被通过,它必须是字符串的类型。
1[label hello.php]
2<?php
3declare(strict_types=1);
4function hello(string $name, string $greeting = "Hello", string $punctuation = null) {
5 $name = ucwords(strtolower($name));
6 return $greeting." ".$name.$punctuation;
7}
8echo hello("SAMMY", "Hola", null);
由于第三个参数的默认值设置为null
,允许一个null
参数以及一个字符串:
1[secondary_label Output]
2Hola Sammy
但是,当参数的默认值被声明为字符串时,它将不再接受一个null
值:
1[label hello.php]
2<?php
3declare(strict_types=1);
4function hello(string $name, string $greeting = "Hello", string $punctuation = "!") {
5 $name = ucwords(strtolower($name));
6 return $greeting." ".$name.$punctuation;
7}
8echo hello("SAMMY", "Hola", null);
相反,给出了类型错误:
1[secondary_label Output]
2Warning: Uncaught TypeError: hello(): Argument #3 ($punctuation) must be of type string, null given
当参数的默认值是除了null
之外,但null
也是一个有效的输入时,PHP通过在类型声明之前添加一个问号来为该关系提供额外的语法:
1[label hello.php]
2<?php
3declare(strict_types=1);
4function hello(string $name, string $greeting = "Hello", ?string $punctuation = null) {
5 $name = ucwords(strtolower($name));
6 return $greeting." ".$name.$punctuation;
7}
8echo hello("SAMMY", "Hola", null);
现在,该函数将接受一个null
的第三个参数,并继续如前所述:
1[secondary_label Output]
2Hola Sammy!
问号前缀适用于所有类型声明,而不仅仅是字符串,并且不需要默认值(如?int $age
)。
返回类型声明
如同可声明参数类型一样,也可以声明函数的返回类型. 若要声明函数的返回类型,在函数定义的关闭组合后,在该类型上添加一个子:
1[label hello.php]
2<?php
3declare(strict_types=1);
4function hello(string $name, string $greeting = "Hello", ?string $punctuation = "!"): ?int {
5 $name = ucwords(strtolower($name));
6 return $greeting." ".$name.$punctuation;
7}
8echo hello("SAMMY");
请注意,声明的返回类型是整数或null
值。
1[secondary_label Output]
2Warning: Uncaught TypeError: hello(): Return value must be of type ?int, string returned
让我们更新返回类型以匹配返回的字符串
类型:
1[label hello.php]
2<?php
3declare(strict_types=1);
4function hello(string $name, string $greeting = "Hello", ?string $punctuation = "!"): string {
5 $name = ucwords(strtolower($name));
6 return $greeting." ".$name.$punctuation;
7}
8echo hello("SAMMY");
这给了我们之前所看到的结果:
1[secondary_label Output]
2Hello Sammy!
没有回报价值
有时一个函数会执行一个不产生返回值的操作;一个例子是var_dump
函数,如果我们回到我们第一个版本的hello
函数,我们可以添加一个void
返回类型:
1[label hello.php]
2<?php
3function hello(): void {
4 echo "Hello World!";
5}
6$greeting = hello();
7var_dump($greeting);
当函数被调用并应用于变量时,输出会显示,因为在函数本身中使用的‘echo’关键字。通过在‘$greeting’变量上使用‘var_dump’,我们可以看到没有返回值,而‘$greeting’变量被设置为‘null’值:
1[secondary_label Output]
2Hello World!
3NULL
空
类型在操纵变量本身时更常用,而不仅仅是一个值。
范围
范围不仅仅是一个技术术语;它适用于我们衡量某事物所处理或相关的区域或物体的范围
的任何东西,例如,大西洋的范围从西美洲延伸到非洲和东欧,并从北极海洋到南部印度洋。
在编程中,范围是指不同的代码如何互相访问. 应用程序中有几个不同的范围区域. 对于函数的目的,我们将研究其中两个 - 文件的 global scope 和 function scope。
默认情况下,全球范围中的代码可以 call 文件所知道的任何函数,但全球范围内的代码无法直接进入函数以访问数据. 它必须依赖函数返回的值。
因为PHP将这两个范围视为单独的实体,当变量被传入函数时,变量的值
被传递,而不是变量本身。
1[label hello.php]
2<?php
3declare(strict_types=1);
4$name = "SAMMY";
5function hello(string $name, string $greeting = "Hello", ?string $punctuation = "!"): string {
6 $name = ucwords(strtolower($name));
7 return $greeting." ".$name.$punctuation;
8}
9echo hello($name);
10echo $name;
代替直接传递字符串,我们现在传递字符串变量。 变量就像直接传递字符串一样,因为只有变量的值才被用来使用。 当函数中的$name
变量值被更改时,函数中的$name
变量才会受到影响。
1[secondary_label Output]
2Hello Sammy!
3SAMMY
「echo hello($name)」的输出是「Hello Sammy」,因为这是函数返回的值,该函数附有「$name」参数。即使在函数被调用后,在全球范围内不会改变「$name」变量的值,所以「echo $name;」的输出是「SAMMY」,因为全球变量仍然设置为「SAMMY」。
获取全球范围
全球范围和函数范围之间的一个大区别是,您可以允许函数到达全球范围以获取数据,但您无法直接从全球范围中获取函数的数据。
1[label hello.php]
2<?php
3declare(strict_types=1);
4$name = "SAMMY";
5function hello(string $greeting = "Hello", ?string $punctuation = "!"): string {
6 global $name;
7 $name = ucwords(strtolower($name));
8 return $greeting." ".$name.$punctuation;
9}
10echo hello();
11echo $name;
变量$name
被设置在全球范围内,但而不是将值传递给函数,函数的第一行现在延伸到从全球范围内抓取变量。
1[secondary_label Output]
2Hello Sammy!
3Sammy
使用全球变量被认为是坏的做法,因为很难追踪变量值可能被修改的地方。
通过参考传递论点
PHP 将参数作为值读取。如果我们传递包含字符串SAMMY
或字符串本身的变量,并不重要,只有使用该值。通过值传递将全球范围和函数范围避免重叠,因为函数可能会返回一个值,所以我们可以使用该值将任何变量设置在一个单独的范围内,甚至一个也被用作参数。通过这样写代码,变量的处理在原始范围内保持清晰。 以前的例子已经改变了$name
变量的值,将变量的值加大,以匹配某些内置函数的返回值。 让我们仔细看看ucwords
和tolower
格式:
1$name = "SAMMY";
2$name = ucwords(strtolower($name));
3echo $name;
这个$name
的新值现在具有新的格式:
1[secondary_label Output]
2Sammy
虽然函数只能返回一个单一的值,但函数可能影响超过一个变量。在我们所写的例子中,你好
函数使用多个变量,但它不会改变这些变量在全球范围中的值。
1[label hello.php]
2<?php
3declare(strict_types=1);
4$name = "SAMMY";
5function hello(string &$name, string $greeting = "Hello", ?string $punctuation = "!"): void {
6 $name = ucwords(strtolower($name));
7 return $greeting." ".$name.$punctuation;
8}
9echo hello($name);
10echo $name;
当$name
变量通过 by reference 时,它在全球范围内改变了该变量的值。
1[secondary_label Output]
2Hello Sammy!
3Sammy
当 pass by reference 时,参数必须是变量. 一个值不再被接受:
1[label hello.php]
2<?php
3declare(strict_types=1);
4function hello(string &$name, string $greeting = "Hello", ?string $punctuation = "!"): string {
5 global $name;
6 $name = ucwords(strtolower($name));
7 return $greeting." ".$name.$punctuation;
8}
9echo hello("SAMMY");
由于没有可参考的变量,因此会出现一个错误:
1[secondary_label Output]
2Warning: Uncaught Error: hello(): Argument #1 ($name) cannot be passed by reference
内置功能
PHP 还包括许多内置的函数,可以用来执行应用程序中的任何数量的常见任务. 这些是实际的函数,这些函数是预先包装的语言。
当您阅读内置函数的 函数定义文档时,它看起来非常像我们编写的用户定义函数,其中包括类型声明。
变量处理功能
变量处理函数提供变量类型或值等细节,其中最常见的变量处理函数之一是 var_dump
:
1[label hello.php]
2<?php
3var_dump("Hello World!");
此函数提供给出的值的详细信息,包括它们的类型和大小。 字符串Hello World!
包含12个字符:
1[secondary_label Output]
2string(12) "Hello World!"
PHP 还提供了与特定类型的变量值互动的额外功能。
String 操作功能
PHP 包含特定的 操纵字符串的函数. 其中一些函数提供有关字符串的详细信息,例如 strlen
:
1echo strlen("How many characters are contained in this string?");
此函数采取一个字符串参数,并返回一个整数,其中包含给定的字符串的字符数:
1[secondary_label Output]
249
其他字符串函数对字符串本身执行一个操作. 它们可以添加、删除、更改字符或转换整个字符串. 这种情况适用于爆炸
函数,该函数根据函数提供的分割字符分开一个字符串,并返回一个数组。
1[label groceries.php]
2<?php
3$groceries = explode(",", "Milk, bread, eggs,fish.");
4var_dump($groceries);
这个第一个参数,一个``字节,告诉函数添加一个新的数组元素,当它达到数组字符时。第二个参数是创建数组时要使用的字符串。空间被用作分割字符,而在结果数组中没有返回。所有其他字符都作为由这个分割字符组合的数组元素返回。
1[secondary_label Output]
2array(4) {
3 [0]=>
4 string(4) "Milk"
5 [1]=>
6 string(6) " bread"
7 [2]=>
8 string(5) " eggs"
9 [3]=>
10 string(5) "fish."
11}
由于该函数将一个字符串划分为一个字符串而不是单个字符串,我们可以使用更长的字符串,例如一个字符串,然后是一个空间 ", "
:
1[label groceries.php]
2<?php
3$groceries = explode(", ", "Milk, bread, eggs,fish.");
4var_dump($groceries);
这使我们的数组项目在开始时没有空间,但它没有将鸡蛋与鱼分开,因为只有一个子,而不是一个子,然后是一个空间:
1[secondary_label Output]
2array(3) {
3 [0]=>
4 string(4) "Milk"
5 [1]=>
6 string(5) "bread"
7 [2]=>
8 string(10) "eggs,fish."
9}
与大多数挑战一样,有许多解决方案来解决上述空间问题,我们将看看一个问题,当我们开始看到数组函数的功能的力量时。
Array 处理功能
数组函数在数组上执行不同的操作,例如分类元素、查找元素、返回密钥、组合数组、对每个元素执行计算等等。
有一个内置的计数
函数来获取数组中的项目数量:
1[label groceries.php]
2<?php
3$groceries = explode(", ", "Milk, bread, eggs,fish.");
4var_dump($groceries);
5echo count($groceries);
数
函数将数组作为参数,并返回包含项目数的整数:
1[secondary_label Output]
2array(3) {
3 [0]=>
4 string(4) "Milk"
5 [1]=>
6 string(5) "bread"
7 [2]=>
8 string(10) "eggs,fish."
9}
103
这表明,3的数
与数组中的项目数相匹配: array(3)
. 现在让我们看看我们如何使用数组函数来构建我们四个项目的杂货列表,而没有开始空间:
1[label groceries.php]
2<?php
3$groceries = explode(",", "Milk, bread, eggs,fish.");
4$groceries = array_map("trim", $groceries);
5var_dump($groceries);
6echo count($groceries);
首先,第 1 行中的爆炸
函数使用了没有空间的字符串,然后添加了第二行以使用名为array_map
的数组函数,该函数将作为数组中的每个项目的第一个参数传递的函数应用,该函数作为第二个参数传递。
1[secondary_label Output]
2array(4) {
3 [0]=>
4 string(4) "Milk"
5 [1]=>
6 string(5) "bread"
7 [2]=>
8 string(4) "eggs"
9 [3]=>
10 string(5) "fish."
11}
124
爆炸
函数将杂货物串转换为数组,但如果杂货列表作为我们想要打印为字符串或列表的数组开始时会怎样呢?可以用implode
函数将数组转换为字符串:
1[label groceries.php]
2<?php
3$groceries = array("milk", "bread", "eggs", "fish");
4echo "Grocery List: " . implode(", ", $groceries);
设置了$groceries
变量(使用array
语言构造)来构建一系列的杂货物品。下一行连接了杂货物品列表:
和一系列的杂货物品,分开一个和一个空间:`。
1[secondary_label Output]
2Grocery List: milk, bread, eggs, fish
有些函数在原始数组本身执行该操作,通过通过引用接受参数。这些函数不会返回结果值。
1[label groceries.php]
2<?php
3$groceries = array("milk", "bread", "eggs", "fish");
4$sorted = sort($groceries);
5var_dump($sorted);
6var_dump($groceries);
类型
应用于原始数组本身,并不会重新分配给新的$sorted
变量,因为sort
函数不会返回新排序数组的结果;相反,它总是返回布尔式的true
。
1[secondary_label Output]
2bool(true)
3array(4) {
4 [0]=>
5 string(5) "bread"
6 [1]=>
7 string(4) "eggs"
8 [2]=>
9 string(4) "fish"
10 [3]=>
11 string(4) "milk"
12}
由于分配对我们没有好处,我们可以将行更改为只对自己进行分类:
1[label groceries.php]
2<?php
3$groceries = array("milk", "bread", "eggs", "fish");
4sort($groceries);
5echo "Grocery List: " . implode(", ", $groceries);
这将使我们能够将数组作为一个排序列表返回:
1[secondary_label Output]
2Grocery List: bread, eggs, fish, milk
额外的内置功能
除了我们之前研究的函数类型之外,还有其他类型,如 Math Functions, Internationalization Functions和其他 Miscellaneous Functions. 可选,额外的函数需要特定的 PHP扩展或 PHP 编译的模块。
语言建设
语言构造类似于内置函数,但它们被硬编码到PHP语言中,虽然它们看起来像一个函数,但它们可能并不总是遵循相同的语法或规则。
1<?php
2echo "Hello World!";
3echo("Hello World!");
或者一个工作,并提供相同的结果:
1[secondary_label Output]
2Hello World!
3Hello World!
语言构造构成语言是如何构建的,并提供必要的功能. 例如,当您尝试访问不存在的变量时,您会收到错误。
1<?php
2if (empty($username)) {
3 echo "Guest";
4}
如果空
是一个常规的函数,你会收到警告,因为你正在尝试访问$username
变量以将其转换为空
。
其他可能被误认为函数的语言构造的例子是array()
,list()
和each()
。这些语言构造,以及内置的函数,为许多常见的编程任务提供解决方案。
结论
函数提供了编写模块化和可重复使用的代码的强大方法. 函数可能来自标准的PHP分布或附加的扩展,用PHP编译。 个别开发人员也可以为一个项目编写函数,或者在多个项目中共享函数。
现在你已经有了了解函数的良好基础,看看PHP提供的许多内置函数,它不仅会给你一个想法,语言可以做什么,但它还会向你展示一些开发人员过去所面临的常见挑战,以及如何解决它们。
- Variable Handling Functions
- String Functions
- Array Functions
- Math Functions
- Internationalization Functions
- Miscellaneous Functions
要了解更多关于PHP的信息,请参阅我们的其余部分(How To Code in PHP series)。