引言
当你发现自己复制和粘贴代码块,以便在程序的不同部分重用时,你就准备好编写函数了。如果你需要与变量的内容进行交互——改变大小写、查找长度、修剪或排序——可能有一个内置函数可以做到这一点。函数是自包含的、可重用的代码块,完成特定的任务。它们提供了模块化,是代码重用的一种方法。
一个函数在被调用之前处于休眠状态。当函数被调用时,它执行函数中定义的任务。一个函数通常接受输入,执行一个操作,然后返回结果输出。函数内部发生的操作建立了输入和输出之间的关系。与函数交互时,需要考虑的三个主要部分是输入、关系和输出。即使输入不是显式的,通常也有一些与代码环境相关的隐式数据:日期、时间、系统、文件、行号等。
在本教程中,您将使用函数的所有不同部分,以便您可以以最佳方式使用函数来解决您的挑战。我们将从编写用户定义函数开始。这些函数将澄清实参和形参之间的区别,通过值和引用传递变量,设置默认值,并使用类型声明来指定可接受的输入和输出类型。通过理解作用域,你将能够操作代码中需要更改的特定部分,而保持其他部分不变。一旦你理解了函数的不同方面以及它们是如何受作用域影响的,你就能够阅读和理解PHP提供的许多内置函数的文档。你将使用内置函数轻松地完成常见的编程任务。
用户定义函数
在多个地方编写相同的代码会使阅读和理解项目变得困难。编程的“核心原则”或基本原则之一是“不要重复自己”,通常被称为DRY编程。变量可以防止我们反复写入相同的数据。函数可以防止我们反复编写相同的操作。
创建和调用函数
编写函数时,必须首先构建函数的结构。这段代码块保持休眠状态,直到它被调用。函数是用function
关键字加上选定的名称和圆括号创建的。函数体由大括号括起来,是执行操作的代码:
hello.php
function hello() { echo "Hello World!";}
这个名为hello
的函数保持休眠状态,这意味着它什么都不做,在函数被调用之前,文件将没有输出。调用函数时,要使用函数名,后面跟着一对圆括号:
hello.php
function hello() { echo "Hello World!";}hello();
调用函数是导致函数执行其操作的原因。在这个例子中,它会显示如下输出:
OutputHello World!
这个简单的例子并不适合使用函数,因为没有任何输入,也就是说没有关系,只有输出。在多个地方使用的数据应该存储在一个变量中,如下所示:
hello.php
$hello = "Hello World!";echo $hello;
这两行代码提供了与函数和调用相同的结果:
OutputHello World!
让我们扩展示例函数以接受输入。
参数和形参
要创建一个在输入和输出之间建立关系的hello
函数,该函数应该接受一些输入。这个输入被接受为函数定义括号中的变量。这个变量可以在函数体中使用:
hello.php
function hello($name) { echo "Hello ".$name;}hello();
函数hello
现在接受一个参数,存储在变量$name
中。然后,通过使用.
字符串连接操作符将字符串“Hello”连接到$name
变量,在函数体中使用该变量。现在,该函数要求在调用函数时传递输入,但没有提供输入,导致PHP返回错误:
OutputWarning: Uncaught ArgumentCountError: Too few arguments to function hello(), 0 passed in php shell code on line 1 and exactly 1 expected
当hello
函数被调用时,它需要一个参数作为输入,该参数设置$name
的值。参数是函数定义的一部分,参数是函数调用的一部分。它们都指向函数的输入。为了给函数提供输入,我们在函数调用的括号中传递一个实参:
hello.php
function hello($name) { echo "Hello ".$name;}hello("Sammy");
这个函数现在可以使用这个字符串输入来创建问候语的输出。问候语会根据调用函数时传入的参数而改变:
OutputHello Sammy
这些基本参数被称为“位置参数”,因为它们必须按照函数定义它们的顺序传递。PHP没有限制用逗号分隔的参数的数量,但函数应该只执行单个操作。稍后我们会介绍函数之间的连接。
Optional Default Values
默认情况下,为函数定义的任何形参都要求在调用函数时传递实参。这使得我们的输出是唯一的,而不是从变量中调用相同的数据。有时,我们并不需要所有参数都有一个唯一的值;相反,如果函数调用不包含该参数,我们可以使用特定的值。要将参数指定为可选的,请给参数一个默认值。不传递参数时使用此值。它可以是任何有效值,包括null
:
hello.php
function hello($name, $greeting = "Hello") { echo $greeting." ".$name;}hello("Sammy", "Bonjour");
现在有了第二个名为$greeting
的参数。然后在函数体中使用这个变量,修改输出中greeting部分的值:
OutputBonjour Sammy
第一个参数$name
没有默认值,因此每次调用函数时都必须包含一个实参。因为第二个形参有默认值,所以这个函数不需要传入第二个形参:
hello.php
function hello($name, $greeting = "Hello") { echo $greeting." ".$name;}hello("Sammy");
当只传递一个参数时,$greeting
变量的值将被设置为默认值“Hello”:
OutputHello Sammy
在同一个函数中,当必需参数和可选参数一起使用时,所有必需参数必须在所有可选参数之前。
可选空值
当变量是完全可选的并且根本不需要值时,默认值可以定义为null
。null
值保存一个值的空间,而不添加额外的值:
hello.php
function hello($name, $greeting = "Hello", $punctuation = null) { echo $greeting." ".$name.$punctuation;}hello("Sammy");
这个变量已经被“声明”了,所以当函数体试图访问这个变量时不会报错,但是这个变量被认为“未设置”,所以不会添加额外的输出:
OutputHello Sammy
返回值
我们可能并不总是想打印函数的输出。为了让函数更灵活,通常的做法是将输出值返回给最初调用函数的代码。用关键字return
代替echo
关键字:
hello.php
function hello($name, $greeting = "Hello", $punctuation = null) { return $greeting." ".$name.$punctuation;}hello("Sammy");echo hello("Sammy");
在第一次调用hello
函数时,没有对返回值做任何处理,这使得它看起来像什么都没有发生,即使函数中的代码被执行了。在第二次调用hello
函数时,在调用函数之前使用了echo
关键字,告诉PHP打印返回的输出结果:
OutputHello Sammy
我们并不总是需要打印结果。这些结果也可以存储在变量中,或者作为另一个函数的输入。
在函数中调用函数
函数是可重用的代码块。大多数可以在函数外部编写的代码也可以在函数内部编写。虽然你可以,但并不意味着你应该这样做。永远不要在另一个函数中定义函数,除非是某些非常高级的情况。然而,你经常会在一个函数中调用另一个函数。要指定问候语的输出格式,可以使用一些内置函数:
hello.php
function hello($name, $greeting = "Hello", $punctuation = null) { $name = ucwords(strtolower($name)); return $greeting." ".$name.$punctuation;}echo hello("SAMMY");
hello
函数中的第一行现在对$name
的值进行了一些格式化。首先,它将字符串转换为小写。strtolower
函数返回一个值,然后立即在第二个函数ucwords
中使用。这会将每个单词的首字母转换为大写。hello
函数现在提供了一致格式的输出,无论接收到的输入是什么:
OutputHello Sammy
类型声明
PHP是一种松散类型的语言,这意味着它将尝试将给定的值转换为适合每种情况的类型。这可能会产生令人惊讶的,有时是不希望的结果。名字应该是一个string
,但是如果我们传递一个integer
会发生什么:
hello.php
function hello($name, $greeting = "Hello", $punctuation = null) { $name = ucwords(strtolower($name)); return $greeting." ".$name.$punctuation;}echo hello(123);
PHP没有任何类型转换的问题,即将整数123
转换为字符串"123"
,然后像之前那样继续执行函数:
OutputHello 123
这是一个有效的输出,但这可能也不是我们想要的结果。让我们看看传递数组时会发生什么。stringtolower
函数会抛出不同的错误;出于演示的目的,我们将在该行的开头添加双斜杠,使其成为注释,从而跳过代码的执行:
hello.php
function hello($name, $greeting = "Hello", $punctuation = null) { // $name = ucwords(strtolower($name)); return $greeting." ".$name.$punctuation;}echo hello(["Sammy", "World"]);
这一次,代码提供了一个通知,但不是很清楚。此外,根据系统的设置方式,可以关闭或忽略通知,因为它们不会停止代码的执行。我们可能没有意识到问题的存在,或者我们可能很难找出问题发生在哪里。输出看起来就像是将字符串“Array”传递给了函数:
OutputNotice: Array to string conversion in php shell code on line 2Hello Array
开发人员花在阅读和调试上的时间远远超过实际编写代码的时间,所以从长远来看,让我们编写的代码尽可能易于阅读和调试将节省时间。从PHP 5开始,在PHP 7中有了更强大的支持,我们现在可以声明或指定函数输入和输出的可接受的值类型。
参数类型声明
参数类型声明确保调用函数时使用的参数值与指定的类型匹配;否则,抛出TypeError。让我们将字符串类型添加到我们的$name
参数中,并再次尝试array
参数。这次我们可以保留stringtolower
这行代码,因为这行代码不会执行:
hello.php
function hello(string $name, $greeting = "Hello", $punctuation = null) { $name = ucwords(strtolower($name)); return $greeting." ".$name.$punctuation;}echo hello(["Sammy", "World"]);
这一次,函数调用导致异常,停止了代码的执行,因此我们没有得到有效的查找输出。这个消息也更清楚地表明了错误的存在:
OutputWarning: Uncaught TypeError: Argument 1 passed to hello() must be of the type string, array given
如果将实参从数组改回整数,就会出现错误,因为实参只能接受字符串。我们试一下:
hello.php
function hello(string $name, $greeting = "Hello", $punctuation = null) { $name = ucwords(strtolower($name)); return $greeting." ".$name.$punctuation;}echo hello(123);
在将integer
转换为string
时,函数不会抛出错误,而是会再次顺利执行:
OutputHello 123
这与PHP是一种松散类型的语言有关。PHP仍然对整数执行类型杂耍,将其转换为字符串,然后继续执行。
严格的类型
防止PHP执行“类型变换”有助于使代码更易于阅读和调试。PHP为我们提供了一种基于每个文件声明严格类型的方法。将此声明添加到任何应该强制严格输入的文件的顶部:
hello.php
declare(strict_types=1);function hello(string $name, $greeting = "Hello", $punctuation = null) { $name = ucwords(strtolower($name)); return $greeting." ".$name.$punctuation;}echo hello(123);
在将声明添加到文件顶部后,当传递integer
而不是string
时,PHP将产生错误:
OutputPHP Fatal error: Uncaught TypeError: Argument 1 passed to hello() must be of the type string, int given.
**注意:**交互式环境不允许你声明strict_types
。
可空类型
我们也可以将hello
函数的第二个参数声明为字符串。因为它有默认值,所以参数不是必需的,但如果传递了参数,它必须是string
类型。第三个参数也是一个带默认值的字符串。null
值也可以在这个函数中使用:
hello.php
declare(strict_types=1);function hello(string $name, string $greeting = "Hello", string $punctuation = null) { $name = ucwords(strtolower($name)); return $greeting." ".$name.$punctuation;}echo hello("SAMMY", "Hola", null);
因为第三个参数的默认值是null
,所以null
和字符串都是允许的:
OutputHola Sammy
然而,当参数的默认值被声明为字符串时,它将不再接受null
值:
hello.php
declare(strict_types=1);function hello(string $name, string $greeting = "Hello", string $punctuation = "!") { $name = ucwords(strtolower($name)); return $greeting." ".$name.$punctuation;}echo hello("SAMMY", "Hola", null);
取而代之的是TypeError:
OutputWarning: Uncaught TypeError: hello(): Argument #3 ($punctuation) must be of type string, null given
当参数的默认值不是null
,但null
也是有效输入时,PHP提供了额外的语法来定义这种关系,即在类型声明之前添加一个问号:
hello.php
declare(strict_types=1);function hello(string $name, string $greeting = "Hello", ?string $punctuation = null) { $name = ucwords(strtolower($name)); return $greeting." ".$name.$punctuation;}echo hello("SAMMY", "Hola", null);
现在函数将接受null
的第三个参数,并继续像之前处理的那样:
OutputHola Sammy!
问号前缀可以用于所有类型声明,而不仅仅是字符串,并且不需要默认值(例如?int $age
)。
返回类型声明
与声明参数类型一样,函数的返回值类型也可以声明。要声明函数的返回类型,在函数定义的右括号后面加上一个冒号和返回类型:
hello.php
declare(strict_types=1);function hello(string $name, string $greeting = "Hello", ?string $punctuation = "!"): ?int { $name = ucwords(strtolower($name)); return $greeting." ".$name.$punctuation;}echo hello("SAMMY");
注意,声明的返回类型要么是整数,要么是null
值。声明的类型与返回值不匹配,会抛出异常:
OutputWarning: Uncaught TypeError: hello(): Return value must be of type ?int, string returned
让我们更新返回类型以匹配返回的string
类型:
hello.php
declare(strict_types=1);function hello(string $name, string $greeting = "Hello", ?string $punctuation = "!"): string { $name = ucwords(strtolower($name)); return $greeting." ".$name.$punctuation;}echo hello("SAMMY");
输出和之前一样:
OutputHello Sammy!
无返回值
有时,函数执行的操作没有返回值;var_dump
函数就是一个例子。如果我们回到hello
函数的第一个版本,我们可以添加一个void
返回类型:
hello.php
function hello(): void { echo "Hello World!";}$greeting = hello();var_dump($greeting);
这声明了函数没有返回值。当函数被调用并应用到一个变量时,输出会显示出来,因为echo
关键字在函数内部使用。通过在$greeting
变量上使用var_dump
,我们可以看到没有返回值,并且$greeting
变量被设置为null
值:
OutputHello World!NULL
void
类型更常用于操作变量本身,而不仅仅是一个值。为此,我们需要理解作用域。
范围
范围不仅仅是一个技术术语;它适用于任何我们衡量“某事物所涉及的领域或主题的范围或相关程度”的东西。例如,大西洋的范围西起美洲,东至非洲和欧洲,北起北冰洋,南至印度洋。如果从大西洋取水并倒入印度洋,这些水就成为印度洋的一部分,对大西洋不再有任何影响。大西洋的范围没有改变。
在编程中,作用域指的是不同代码之间如何相互访问。在一个应用程序中有几个不同的范围。就函数而言,我们将研究其中的两个——文件的全局作用域和函数作用域。
默认情况下,全局作用域中的代码可以调用文件所知道的任何函数,但全局作用域中的代码不能直接访问函数来访问数据。它必须依赖于函数的返回值。默认情况下,函数作用域中的代码从全局作用域中接受输入,并将输出返回到全局作用域中。函数作用域中的代码不会直接进入全局作用域。
因为PHP将这两个作用域视为独立的实体,所以当将变量传递给函数时,传递的是变量的“值”而不是变量本身。让我们设置一个全局变量,看看这对代码意味着什么:
hello.php
declare(strict_types=1);$name = "SAMMY";function hello(string $name, string $greeting = "Hello", ?string $punctuation = "!"): string { $name = ucwords(strtolower($name)); return $greeting." ".$name.$punctuation;}echo hello($name);echo $name;
我们现在传递一个字符串变量,而不是直接传递一个字符串。这个变量的工作方式与直接传递字符串的方式相同,因为只使用变量的值。当函数内部的$name
变量的值发生改变时,只有函数内部的$name
变量受到影响。全局作用域中的$name
变量是一个单独的变量:
OutputHello Sammy!SAMMY
echo hello($name)
的输出是“Hello Sammy”,因为这是函数通过$name
参数返回的值。即使在函数被调用之后,$name
变量的值在全局作用域中也没有改变,因此echo $name;
的输出是“SAMMY”,因为全局变量仍然被设置为“SAMMY”。
访问全局作用域
全局作用域和函数作用域之间的一个很大的区别是,你可以允许函数进入全局作用域来获取数据,但你不能直接从全局作用域中的函数中获取数据。global
关键字可以延伸到全局作用域:
hello.php
declare(strict_types=1);$name = "SAMMY";function hello(string $greeting = "Hello", ?string $punctuation = "!"): string { global $name; $name = ucwords(strtolower($name)); return $greeting." ".$name.$punctuation;}echo hello();echo $name;
变量$name
是在全局作用域中设置的,但是现在函数的第一行代码从全局作用域中获取变量,而不是将值传递给函数。global
关键字获取变量本身而不仅仅是它的值。在函数内完成的格式化会应用到变量的全局作用域,这也会改变函数外部变量的值:
OutputHello Sammy!Sammy
使用全局变量被认为是不好的实践,因为很难跟踪变量的值在哪里被修改了。当需要修改变量时,更好的方法是传递变量的引用。
按引用传递参数
PHP将参数作为值读取。它不关心我们传递的是包含字符串“SAMMY”的变量还是字符串本身。仅使用该值。通过值传递可以避免全局作用域和函数作用域重叠。因为函数可能会返回一个值,所以我们可以使用这个值来设置单独作用域中的任何变量,甚至可以将其用作参数。通过这种方式编写代码,对变量的处理可以清晰地保持在原始作用域中。前面的例子通过覆盖变量的值来更改$name
变量的值,以匹配一些内置函数的返回值。让我们仔细看看ucwords
和strtolower
的格式化:
$name = "SAMMY";$name = ucwords(strtolower($name));echo $name;
$name
的新值现在具有新的格式:
OutputSammy
虽然一个函数只能返回一个值,但一个函数可能会影响多个变量。在我们写的例子中,hello
函数使用多个变量,但它不会在全局作用域中改变这些变量的值。PHP提供了一种直接与来自另一个作用域的变量交互的方法,通过传递对变量本身的引用,而不仅仅是它的值。参数通过引用传递,可以在任何参数上添加(&
):
hello.php
declare(strict_types=1);$name = "SAMMY";function hello(string &$name, string $greeting = "Hello", ?string $punctuation = "!"): void { $name = ucwords(strtolower($name)); return $greeting." ".$name.$punctuation;}echo hello($name);echo $name;
当$name
变量通过引用传递时,它会改变该变量在全局作用域中的值。在函数被调用之后,$name
会保留格式:
OutputHello Sammy!Sammy
当引用传递时,参数必须是变量。一个值不再被接受:
hello.php
declare(strict_types=1);function hello(string &$name, string $greeting = "Hello", ?string $punctuation = "!"): string { global $name; $name = ucwords(strtolower($name)); return $greeting." ".$name.$punctuation;}echo hello("SAMMY");
因为没有变量可以引用,所以会报错:
OutputWarning: Uncaught Error: hello(): Argument #1 ($name) cannot be passed by reference
内置函数
PHP还包括许多内置函数,可用于执行应用程序中的任意数量的常见任务。这些是语言中预先打包的实际函数。和所有函数一样,这些内置函数也需要使用圆括号。
当你阅读内置函数的函数定义文档时,它看起来很像我们编写的用户定义函数,其中包括类型声明。
变量处理函数
变量处理函数提供变量的详细信息,例如它的类型或值。最常见的变量处理函数之一是var_dump
:
hello.php
var_dump("Hello World!");
这个函数给出给定值的详细信息,包括它们的类型和大小。字符串“Hello World!”,包含12个字符:
Outputstring(12) "Hello World!"
PHP还提供了额外的函数来与特定类型变量的值进行交互。
字符串处理函数
PHP包含特定的用于操作字符串的函数。其中一些函数提供了字符串的详细信息,例如strlen
:
echo strlen("How many characters are contained in this string?");
这个函数接受一个字符串参数,并返回一个整数,其中包含给定字符串包含的字符数:
Output49
其他字符串函数对字符串本身执行操作。它们可以添加、删除、更改字符或转换整个字符串。这就是explode
函数的情况,它根据提供给函数的分隔字符将字符串分割开来,并返回一个数组。要将逗号分隔的列表转换为数组,可以像下面这样使用explode
函数:
groceries.php
$groceries = explode(",", "Milk, bread, eggs,fish.");var_dump($groceries);
第一个参数是一个逗号","
,它告诉函数在遇到逗号字符时添加一个新的数组元素。第二个参数是创建数组时使用的字符串。空格用作分隔符,不会返回到结果数组中。所有其他字符都以这个分隔字符分组的形式返回数组元素。在本例中,它为每个商品创建了一个数组:
Outputarray(4) { [0]=> string(4) "Milk" [1]=> string(6) " bread" [2]=> string(5) " eggs" [3]=> string(5) "fish."}
每个字符都与原始字符串中的字符保持一致,包括大小写、空格和特殊字符(如句点)。由于该函数将字符串分割为多个字符串,而不仅仅是单个字符,因此我们可以使用更长的字符串,例如逗号后跟空格", "
:
groceries.php
$groceries = explode(", ", "Milk, bread, eggs,fish.");var_dump($groceries);
这样做可以避免数组项开头有空格,但并没有将鸡蛋和鱼分开,因为只有逗号,而逗号后面没有空格:
Outputarray(3) { [0]=> string(4) "Milk" [1]=> string(5) "bread" [2]=> string(10) "eggs,fish."}
与大多数挑战一样,上述空间问题有许多解决方案。在我们开始了解数组函数的强大功能时,我们将看一看其中一个。
数组处理函数
数组函数在数组上执行不同的操作,例如排序元素,查找元素,返回键,组合数组,对每个项目执行计算,等等。
有一个内置的count
函数可以获取数组中元素的数量:
groceries.php
$groceries = explode(", ", "Milk, bread, eggs,fish.");var_dump($groceries);echo count($groceries);
count
函数接受一个数组作为参数,并返回一个包含项目数量的整数:
Outputarray(3) { [0]=> string(4) "Milk" [1]=> string(5) "bread" [2]=> string(10) "eggs,fish."}3
这表明3的“计数”与数组array(3)
中的项数匹配。现在来看看如何使用array函数来创建包含所有四种商品且开头没有空格的购物清单:
groceries.php
$groceries = explode(",", "Milk, bread, eggs,fish.");$groceries = array_map("trim", $groceries);var_dump($groceries);echo count($groceries);
首先,第1行的explode
函数使用了一个没有空格的逗号。然后添加第二行代码来使用名为array_map
的数组函数。这个函数将作为第一个参数传入的函数应用于作为第二个参数传入的数组中的每一项。传递的函数可以是用户定义函数,也可以是内置函数。在这种情况下,它使用内置的trim
函数,该函数“修剪”变量开头和末尾的空白:
Outputarray(4) { [0]=> string(4) "Milk" [1]=> string(5) "bread" [2]=> string(4) "eggs" [3]=> string(5) "fish."}4
explode
函数将杂货店商品的字符串转换为数组,但如果杂货店列表一开始是一个数组,我们想将其打印为字符串或列表,该怎么办?implode
函数可用于将数组转换为字符串:
groceries.php
$groceries = array("milk", "bread", "eggs", "fish");echo "Grocery List: " . implode(", ", $groceries);
设置$groceries
变量(使用array
语言构造)来构建一个杂货商品数组。下一行将字符串"Grocery List: "连接为一个杂货店商品字符串,中间用逗号和空格", "
分隔。逗号和空格只分隔项本身;它们不会被添加到字符串的开头或末尾:
OutputGrocery List: milk, bread, eggs, fish
有些函数通过引用接收参数,在原始数组上执行操作。这些函数不会返回结果值。为了对购物清单进行排序,我们可以添加一行sort
函数:
groceries.php
$groceries = array("milk", "bread", "eggs", "fish");$sorted = sort($groceries);var_dump($sorted);var_dump($groceries);
sort
应用于原始数组本身,并且不会被重新赋值给新的$sorted
变量,因为sort
函数不返回新排序数组的结果;相反,它总是返回布尔值true
。所以$sorted
变量的布尔值为true
,而原始的$groceries
数组是按字母顺序排序的:
Outputbool(true)array(4) { [0]=> string(5) "bread" [1]=> string(4) "eggs" [2]=> string(4) "fish" [3]=> string(4) "milk"}
由于赋值没有给我们带来好处,我们可以将这行代码改为只排序:
groceries.php
$groceries = array("milk", "bread", "eggs", "fish");sort($groceries);echo "Grocery List: " . implode(", ", $groceries);
这将允许我们以有序列表的形式返回数组:
OutputGrocery List: bread, eggs, fish, milk
额外的内置函数
在标准PHP发行版中有超过1000个内置函数,您可以找到用于许多常见编程任务的函数。除了我们前面看到的函数类型之外,还有其他类型,例如数学函数、国际化功能和其他其他各样的功能。可选地,附加的函数需要特定的PHP扩展或PHP编译模块。在编写用户定义函数之前,请查看PHP是否有满足要求的内置函数。
语言结构
语言构造类似于内置函数,但它们是硬编码到PHP语言中的。虽然它们看起来像一个函数,但它们可能并不总是遵循相同的语法或规则。举个例子,echo
关键字是一个不需要括号的语言结构:
echo "Hello World!";echo("Hello World!");
这两种方法都可以工作,并提供相同的结果:
OutputHello World!Hello World!
语言结构构成了语言的构建方式,并提供了基本的功能。例如,当你试图访问一个不存在的变量时,就会得到错误。要在访问一个变量之前测试它是否存在,你需要咨询isset
或empty
:
if (empty($username)) { echo "Guest";}
如果empty
是一个普通函数,你会得到一个警告,因为你试图访问$username
变量并将其传递给empty
。然而,由于empty
是一种语言结构,它不会抛出警告。
其他可能被误认为是函数的语言结构的例子有array()
、list()
和each()
。这些语言构造和内置函数为许多常见的编程任务提供了解决方案。当这些组件还不够时,用户定义的函数提供了一个为项目创建可重用代码块的工具。
总结
函数提供了一种强大的方式来编写模块化和可重用的代码。函数可以来自标准PHP发行版,也可以是PHP编译的附加扩展。单个开发人员也可以为单个项目编写函数,或者在多个项目之间共享函数。当您需要针对多个项目或位置执行操作时,函数就是工具。
现在您已经有了一个理解函数的良好基础,看看PHP提供的许多内置函数。它不仅会让你了解这门语言能做什么,还会向你展示开发人员过去面临的一些常见挑战以及如何解决这些挑战。
来源地址:https://blog.csdn.net/QIU176161650/article/details/132455078