函数

创建PHP函数

函数是通过调用函数来执行的

语法

1
2
3
4
5
6
<?php
function functionName()
{
// 要执行的代码
}
?>

PHP函数准则:

  • 函数的名称应该提示出它的功能
  • 函数名称以字母或下划线开头,不能以数字开头

例如

1
2
3
4
5
6
7
8
<?php
function writeName()
{
echo "Kai Jim Refsnes";
}

echo "My name is ";
writeName();

运行结果
1
My name is Kai Jim Refsnes

添加参数

为了给函数添加更多的功能,我们可以添加参数,参数类似于变量
参数就在函数名称后面的一个括号内指定

例如

1
2
3
4
5
6
7
8
9
10
11
12
<?php
function writeName($fname)
{
echo $fname . " Refsnes.\n";
}

echo "My name is ";
writeName("Kai Jim");
echo "My sister's name is ";
writeName("Hege");
echo "My brother's name is ";
writeName("Stale");

运行结果
1
2
3
My name is Kai Jim Refsnes.
My sister's name is Hege Refsnes.
My brother's name is Stale Refsnes.

还可以为两个参数

1
2
3
4
5
6
7
8
9
10
11
12
<?php
function writeName($fname,$punctuation)
{
echo $fname . " Refsnes" . $punctuation . "\n";
}

echo "My name is ";
writeName("Kai Jim",".");
echo "My sister's name is ";
writeName("Hege","!");
echo "My brother's name is ";
writeName("Ståle","?");

运行结果
1
2
3
My name is Kai Jim Refsnes.
My sister's name is Hege Refsnes!
My brother's name is Ståle Refsnes?

返回值

使用return语句

1
2
3
4
5
6
7
8
<?php
function add($x,$y)
{
$total=$x+$y;
return $total;
}

echo "1 + 16 = " . add(1,16);

运行结果

1
1 + 16 = 17

魔术常量

PHP向它运行的任何脚本提供了大量的预定义常量

还可以通过加载拓展库来实现更多常量

有八个魔术常量它们的值随着它们在代码中的位置改变而改变

_LINE_

文件中的当前行号

1
2
<?php
echo '这是第 " ' . __LINE__ . ' " 行';

运行结果
1
这是第 " 2 "

_FILE_

文件的完整路径和文件名。如果用在被包含文件中,则返回被包含的文件名

从PHP4.0.2后,总是包含一个绝对路径

1
2
<?php
echo '该文件位于 " ' . __FILE__ . ' " ';

运行结果

1
该文件位于 " F:\default\PHP_default\test1.php "

_DIR_

返回文件所在的目录。如果用在被包括文件中,则返回被包含的文件所在的目录

等价于dirname(_FILE_)。除非是根目录,否则目录名不包括末尾的斜杠

1
2
<?php
echo '该文件位于 " ' . __DIR__ . ' " ';

运行结果

1
该文件位于 " F:\default\PHP_default "

_FUNCTION_

返回函数所在的函数名称。自PHP5起本常量返回该函数被定义时的名字(区分大小写)

1
2
3
4
5
<?php
function test() {
echo '函数名为:' . __FUNCTION__ ;
}
test();

运行结果

1
函数名为:test

_CLASS_

返回所在类的名称。自PHP5起本常量返回该类被定义时的名字(区分大小写)

1
2
3
4
5
6
7
8
9
<?php
class test {
function _print() {
echo '类名为:' . __CLASS__ . "\n";
echo '函数名为:' . __FUNCTION__ ;
}
}
$t = new test();
$t->_print();

运行结果

1
2
类名为:test
函数名为:_print

_TRAIT_

Trait的名字。自PHP5.4起,PHP实现代码复用的一个方法,称为traits

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php
class Base {
public function sayHello() {
echo 'Hello ';
}
}

trait SayWorld {
public function sayHello() {
parent::sayHello();
echo 'World!';
}
}

class MyHelloWorld extends Base {
use SayWorld;
}

$o = new MyHelloWorld();
$o->sayHello();

运行结果

1
Hello World!

_METHOD_

返回类的方法名。返回该方法被定义时的名字

1
2
3
4
5
<?php
function test() {
echo '函数名为:' . __METHOD__ ;
}
test();

运行结果
1
函数名为:test

_NAMESPACE_

返回当前命名空间的名称(区分大小写)

1
2
3
4
<?php
namespace MyProject;

echo '命名空间为:"', __NAMESPACE__, '"'; // 输出 "MyProject"

运行结果
1
命名空间为:"MyProject"

总结

1.PHP中定义函数使用function关键字

2.魔术常量_FUNCTION_和_METHOD_的区别在于,_FUNCTION_只返回方法(函数)的名字;_METHOD_会返回类名和方法的名字

3.PHP中的trait关键字是实现代码复用的方法,是为了PHP的单继承性质而准备的一种代码复用机制

trait的基本用法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
trait ezcReflectionReturnInfo {
function getReturnType() { /*1*/ }
function getReturnDescription() { /*2*/ }
}

class ezcReflectionMethod extends ReflectionMethod {
use ezcReflectionReturnInfo;
/* ... */
}

class ezcReflectionFunction extends ReflectionFunction {
use ezcReflectionReturnInfo;
/* ... */
}

优先级顺序:

从基类继承的成员被插入的 SayWorld Trait 中的 MyHelloWorld 方法所覆盖。其行为 MyHelloWorld 类中定义的方法一致。优先顺序是当前类中的方法会覆盖 trait 方法,而 trait 方法又覆盖了基类中的方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php
class Base {
public function sayHello() {
echo 'Hello ';
}
}

trait SayWorld {
public function sayHello() {
parent::sayHello();
echo 'World!';
}
}

class MyHelloWorld extends Base {
use SayWorld;
}

$o = new MyHelloWorld();
$o->sayHello();

修改方法的访问控制

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
trait HelloWorld {
public function sayHello() {
echo 'Hello World!';
}
}

// 修改 sayHello 的访问控制
class MyClass1 {
use HelloWorld { sayHello as protected; }
}

// 给方法一个改变了访问控制的别名
// 原版 sayHello 的访问控制则没有发生变化
class MyClass2 {
use HelloWorld { sayHello as private myPrivateHello; }
}

更多用法可以参考手册
https://www.php.net/manual/zh/language.oop5.traits.php