PHP基础加固——函数

it2023-11-21  5

 

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)