PHP基础加固——函数

 

0x00 用户自定义函数

一个函数可以用以下语法定义:

 

1 <?php
2 function foo($arg_1, $arg_2, ..., $arg_n)
3 {
4     echo "Example function.\n";
5     return $retval;
6 }
7 ?> 

 

任何有效的 PHP 代码都有可能出现在函数内部,甚至包括其它函数和类定义。 函数名和 PHP 中的其它标识符命名规则相同。有效的函数名以字母或下划线打头,后面跟字母,数字或下划线。

除非是下面两个例子中的情况,函数必须在其调用之前定义。

  • 条件函数
 1 <?php
 2 
 3 $makefoo = true;
 4 
 5 /* 我们不能在处调用foo()函数,
 6    因为它还不存在,但可以调用bar()函数。*/
 7 
 8 bar();
 9 
10 if ($makefoo) {
11   function foo()
12   {
13     echo "I don't exist until program execution reaches me.\n";
14   }
15 }
16 
17 /* 现在我们可以安全调用函数 foo()了,
18    因为 $makefoo 值为真 */
19 
20 if ($makefoo) foo();
21 
22 function bar()
23 {
24   echo "I exist immediately upon program start.\n";
25 }
26 
27 ?> 
  • 函数中的函数
<?php
function foo()
{
  function bar()
  {
    echo "I don't exist until foo() is called.\n";
  }
}

/* 现在还不能调用bar()函数,因为它还不存在 */

foo();

/* 现在可以调用bar()函数了,因为foo()函数
   的执行使得bar()函数变为已定义的函数 */

bar();

?> 

PHP 中的所有函数和类都具有全局作用域,可以在内部定义外部调用,反之亦然。

PHP 不支持函数重载,也不可能取消定义或者重定义已声明的函数。

  •  递归函数
1 <?php
2 function recursion($a)
3 {
4     if ($a < 20) {
5         echo "$a\n";
6         recursion($a + 1);
7     }
8 }
9 ?> 

 

0x01函数的参数

通过参数列表可以传递信息到函数,即以逗号作为分隔符的表达式列表。 PHP 支持按值传递参数(默认),通过引用传递参数以及默认参数。也支持可变数量的参数;

向函数传递数组:

1 <?php
2 function takes_array($input)
3 {
4     echo "$input[0] + $input[1] = ", $input[0]+$input[1];
5 }
6 ?> 

1. 通过引用传递参数

缺省情况下,函数参数通过值传递(因而即使在函数内部改变参数的值,它并不会改变函数外部的值)。如果希望允许函数修改它的参数值,必须通过引用传递参数。 如果想要函数的一个参数总是通过引用传递,可以在函数定义中该参数的前面预先加上符号 &:

用引用传递函数参数:

1 <?php
2 function add_some_extra(&$string)
3 {
4     $string .= 'and something extra.';
5 }
6 $str = 'This is a string, ';
7 add_some_extra($str);
8 echo $str;    // outputs 'This is a string, and something extra.'
9 ?> 

2. 默认参数的值

函数可以定义 C++ 风格的标量参数默认值, 在函数中使用默认参数:

1 <?php
2 function makecoffee($type = "cappuccino")
3 {
4     return "Making a cup of $type.\n";
5 }
6 echo makecoffee();
7 echo makecoffee(null);
8 echo makecoffee("espresso");
9 ?> 

以上例程会输出:

Making a cup of cappuccino.
Making a cup of .
Making a cup of espresso.

0x02 返回值

值通过使用可选的返回语句返回。可以返回包括数组和对象的任意类型。返回语句会立即中止函数的运行,并且将控制权交回调用该函数的代码行。

  • return 的使用:
1 <?php
2 function square($num)
3 {
4     return $num * $num;
5 }
6 echo square(4);   // outputs '16'.
7 ?> 

函数不能返回多个值,但可以通过返回一个数组来得到类似的效果。

  • 返回一个数组以得到多个返回值:
1 <?php
2 function small_numbers()
3 {
4     return array (0, 1, 2);
5 }
6 list ($zero, $one, $two) = small_numbers();
7 ?> 

从函数返回一个引用,必须在函数声明和指派返回值给一个变量时都使用引用操作符 & :

  • 从函数返回一个引用
1 <?php
2 function &returns_reference()
3 {
4     return $someref;
5 }
6 
7 $newref =& returns_reference();
8 ?> 

0x03 可变函数

PHP 支持可变函数的概念。这意味着如果一个变量名后有圆括号,PHP 将寻找与变量的值同名的函数,并且尝试执行它。可变函数可以用来实现包括回调函数,函数表在内的一些用途。

变量函数不能用于语言结构,例如 echo, print, unset(), isset(), empty(), include, require 以及类似的语句。需要使用自己的包装函数来将这些结构用作变量函数。

  • 可变函数示例:
 1 <?php
 2 function foo() {
 3     echo "In foo()<br />\n";
 4 }
 5 
 6 function bar($arg = '') {
 7     echo "In bar(); argument was '$arg'.<br />\n";
 8 }
 9 
10 // 使用 echo 的包装函数
11 function echoit($string)
12 {
13     echo $string;
14 }
15 
16 $func = 'foo';
17 $func();        // This calls foo()
18 
19 $func = 'bar';
20 $func('test');  // This calls bar()
21 
22 $func = 'echoit';
23 $func('test');  // This calls echoit()
24 ?> 

还可以利用可变函数的特性来调用一个对象的方法。

  • 可变方法范例:
 1 <?php
 2 class Foo
 3 {
 4     function Variable()
 5     {
 6         $name = 'Bar';
 7         $this->$name(); // This calls the Bar() method
 8     }
 9 
10     function Bar()
11     {
12         echo "This is Bar";
13     }
14 }
15 
16 $foo = new Foo();
17 $funcname = "Variable";
18 $foo->$funcname();   // This calls $foo->Variable()
19 
20 ?> 

0x04 匿名函数

Anonymous function 示例

1 <?php
2 echo preg_replace_callback('~-([a-z])~', function ($match) {
3     return strtoupper($match[1]);
4 }, 'hello-world');
5 // 输出 helloWorld
6 ?> 

闭包函数也可以作为变量的值来使用。PHP会自动把表达式转换成内置类Closure的 对象实例。把一个closure对象赋值给一个变量的方式与普通变量赋值的语法是一样的,最后也要加上分号。

匿名函数变量赋值示例:

1 <?php
2 $greet = function($name)
3 {
4     printf("Hello %s\r\n", $name);
5 };
6 
7 $greet('World');
8 $greet('PHP');
9 ?> 

返回值类型声明

PHP 7 增加了对返回类型声明的支持。 类似于参数类型声明,返回类型声明指明了函数返回值的类型。可用的类型与参数声明中可用的类型相同。

 1 <?php
 2 
 3 function arraysSum(array $arrays): array
 4 {
 5     return array_map(function(array $array): int {
 6         return array_sum($array);
 7     }, $arrays);
 8 }
 9 
10 print_r(arraysSum([1,2,3], [4,5,6], [7,8,9]));

以上例程会输出:

1 Array
2 (
3     [0] => 6
4     [1] => 15
5     [2] => 24
6 )

 

转载于:https://www.cnblogs.com/hackerbird/p/8782042.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值