(1)函数结构
- PHP中的函数就是完成某些功能的代码段
- PHP中的函数分为系统函数和自定义函数
- 系统函数:字符串、数学、数组、日期函数…
- 自定义函数:按照具体需求封装的函数
- 关键字 函数名 参数列表 函数体 返回值
- 如果省略return,则返回NULL
- 函数名不区分大小写
- 函数名不可以重复,包括系统函数名
- function_exists(‘name’)检测函数是否存在
- 函数的声明不必在调用之前
function name($a,$b){
return $a+$b;
}
(2)参数列表
- 实参的数目大于形参的数目,函数正常执行(截取前面的)
<?php
function sum($a,$b){
echo $a+$b;
}
sum(1);
sum(1,2);
sum(1,2,3);
<?php
function greet($name,$is_formal = false){
if(!$is_formal){
echo "Hi, ",$name,"\n";
}else{
echo "Hello, ",$name,"\n";
}
}
greet("Jack");
greet("Tom",true);
<?php
function greet($is_formal = false,$name){
if(!$is_formal){
echo "Hi, ",$name,"\n";
}else{
echo "Hello, ",$name,"\n";
}
}
greet(true,"Tom");
greet("Tom");
- 强类型参数
- 为参数列表中的参数指定类型。如果传入的数据类型不匹配,将会抛出TypeError异常
<?php
function add1($a,$b){
echo $a+$b;
}
function add2(int $a,int $b){
echo $a+$b;
}
add1(3.5,5);
add2(3.5,5);
<?php
function get_sum(){
$args_num = func_num_args();
$sum = 0;
print_r(func_get_args());
if($args_num == 0){
return $sum;
}else{
for($i=0;$i<$args_num;$i++){
$sum += func_get_arg($i);
}
return $sum;
}
}
echo get_sum(1,2,3,4,5);
echo get_sum();
echo get_sum(11,22);
<?php
function get_sum(...$nums){
$sum = 0;
if(!$nums){
return $sum;
}else{
foreach($nums as $num){
$sum += $num;
}
return $sum;
}
}
echo get_sum(1,2,3,4,5);
echo get_sum();
echo get_sum(11,22);
(3)返回值
- 函数可以有0个或者一个返回值
- 如果想返回多个返回值可以通过数组或对象实现
- 函数通过return加返回值,函数碰到return立即结束
- 函数的返回值可以是任意类型
- 函数默认返回NULL
- 返回值不等于输出echo
(4)值传递和引用传递
<?php
function factorial($num){
$sum = 1;
for($i=1;$i<=$num;$i++){
$sum *= $i;
}
$num = 5;
echo $sum+"\n";
}
$num = 3;
factorial($num);
echo $num;
<?php
function swap(&$a,&$b){
$tmp = $a;
$a = $b;
$b = $tmp;
}
$a = 5;
$b = 10;
swap($a,$b);
echo $a,$b;
(5)变量作用域
- 全局变量
- 在页面中生成的变量都是全局变量,在整个页面都是有效,不能被传递到其他页面
- 但是不能被函数或者类中的方法访问
<?php
$a = 1;
function test(){
echo $a;
}
test();
<?php
static $a = 1;
function test(){
echo $a;
}
test();
<?php
$g_name = "Lily";
function show(){
global $g_name;
echo $g_name;
}
show();
<?php
$g_sex = "女";
function display(){
echo $GLOBALS['g_sex'];
}
display();
<?php
$v1 = 1;
$v2 = 2;
function swap1(){
global $v1,$v2;
$v2 = &$v1;
}
swap1();
echo $v2;
$v1 = 1;
$v2 = 2;
function swap2(){
$GLOBALS['v2'] = &$GLOBALS['v1'];
}
swap2();
echo $v2;
<?php
$g_name = "Lily";
function show(){
global $g_name;
echo $g_name;
}
show();
$g_sex = "女";
function display(){
echo $GLOBALS['g_sex'];
}
display();
var_dump($GLOBALS);
Lily女
C:\Users\wangc\Desktop\php\test.php:20:array (size=10)
'_GET' =>
array (size=0)
empty
'_POST' =>
array (size=0)
empty
'_COOKIE' =>
array (size=0)
empty
'_FILES' =>
array (size=0)
empty
'_ENV' =>
array (size=0)
empty
'_REQUEST' =>
array (size=0)
empty
'_SERVER' =>
array (size=35)
'HTTP_HOST' => string 'localhost:8080' (length=14)
'HTTP_USER_AGENT' => string 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:57.0) Gecko/20100101 Firefox/57.0' (length=78)
'HTTP_ACCEPT' => string 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8' (length=63)
'HTTP_ACCEPT_LANGUAGE' => string 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2' (length=59)
'HTTP_ACCEPT_ENCODING' => string 'gzip, deflate' (length=13)
'HTTP_CONNECTION' => string 'keep-alive' (length=10)
'HTTP_UPGRADE_INSECURE_REQUESTS' => string '1' (length=1)
'HTTP_CACHE_CONTROL' => string 'max-age=0' (length=9)
'PATH' => string 'C:\ProgramData\Oracle\Java\javapath;C:\Program Files (x86)\Intel\iCLS Client\;C:\Program Files\Intel\iCLS Client\;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files (x86)\NVI'... (length=1014)
'SystemRoot' => string 'C:\WINDOWS' (length=10)
'COMSPEC' => string 'C:\WINDOWS\system32\cmd.exe' (length=27)
'PATHEXT' => string '.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC' (length=53)
'WINDIR' => string 'C:\WINDOWS' (length=10)
'SERVER_SIGNATURE' => string '<address>Apache/2.4.23 (Win64) PHP/5.6.25 Server at localhost Port 8080</address>
' (length=82)
'SERVER_SOFTWARE' => string 'Apache/2.4.23 (Win64) PHP/5.6.25' (length=32)
'SERVER_NAME' => string 'localhost' (length=9)
'SERVER_ADDR' => string '::1' (length=3)
'SERVER_PORT' => string '8080' (length=4)
'REMOTE_ADDR' => string '::1' (length=3)
'DOCUMENT_ROOT' => string 'C:/Users/wangc/Desktop/php' (length=26)
'REQUEST_SCHEME' => string 'http' (length=4)
'CONTEXT_PREFIX' => string '' (length=0)
'CONTEXT_DOCUMENT_ROOT' => string 'C:/Users/wangc/Desktop/php' (length=26)
'SERVER_ADMIN' => string 'wampserver@wampserver.invalid' (length=29)
'SCRIPT_FILENAME' => string 'C:/Users/wangc/Desktop/php/test.php' (length=35)
'REMOTE_PORT' => string '63522' (length=5)
'GATEWAY_INTERFACE' => string 'CGI/1.1' (length=7)
'SERVER_PROTOCOL' => string 'HTTP/1.1' (length=8)
'REQUEST_METHOD' => string 'GET' (length=3)
'QUERY_STRING' => string '' (length=0)
'REQUEST_URI' => string '/test.php' (length=9)
'SCRIPT_NAME' => string '/test.php' (length=9)
'PHP_SELF' => string '/test.php' (length=9)
'REQUEST_TIME_FLOAT' => float 1514209541.292
'REQUEST_TIME' => int 1514209541
'GLOBALS' =>
&array< 'g_name' => string 'Lily' (length=4)
'g_sex' => string '女' (length=3)
- 局部变量
- 函数体内声明的变量为局部变量
- 局部变量分为动态变量和静态变量
- 动态变量在函数执行完立即释放
- 静态变量,第一次执行函数时初始化静态变量,当函数执行完毕后静态不会释放而是保存在静态内存中,当再次调用时直接从静态内存中取出变量值执行
- 在函数中声明的普通变量,在函数内部有效
- 在类中声明的属性,在类的内部有效
<?php
function test(){
$b = 2;
echo $b;
}
test();
var_dump($b);
<?php
function sum1(){
$a = 0;
echo $a++;
}
sum1();
sum1();
function sum2(){
static $a = 0;
echo $a++;
}
sum2();
sum2();
- 超全局变量
- 如果想被函数或者类中方法访问,就得使用超全局变量$_GET $_POST $_COOKIE $_SERVER $FILES $_ENV $_REQUEST $_SESSION
(6)复杂函数
- get_defined_functions()获取所有定义的函数
<?php
print_r(get_defined_functions());
Array (
[internal] => Array ( [0] => zend_version [1910] => xdebug_get_headers )
[user] => Array ( ) )
- 可变函数
- 可变函数不能用于像echo print unset() isset() empty include require等类似的语言结构,需要自己封装之后实现
<?php
function apple(){
echo 'apple';
}
function banana(){
echo 'apple';
}
$name = 'apple';
$name();
$name = 'banana';
$name();
- 嵌套函数
- 当外部函数被调用时,内部函数就会自动进入全局域中,成为新的定义函数
- 单层嵌套
<?php
function out(){
echo '外部函数被调用';
if(!function_exists('in')){
function in(){
echo '外部函数没有被调用,内部函数是不存在的';
}
}
}
out();
in();
out();
<?php
function out(){
echo 'out';
function mid(){
echo 'mid';
function in(){
echo 'in';
}
}
}
out();
mid();
in();
<?php
function out($name){
if(!function_exists('in')){
function in($name){
echo 'in:'.$name;
}
}
echo 'out:'.$name;
}
out('Hello');
in('Hi');
function factoria($num){
$sum = 1;
if(1 == $num){
$sum = $sum * 1;
}else{
$sum = $num * factoria($num-1);
}
return $sum;
}
echo factoria(6);
<?php
function add($x,$y){
return $x+$y;
}
function reduce($x,$y){
return $x-$y;
}
function calc($funcName,$i,$j){
return $funcName($i,$j);
}
echo calc('add',3,2);
echo calc('reduce',3,2);
<?php
$arr = array(1,2,3,5);
function add($num){
return $num*2;
}
$res = array_map('add',$arr);
print_r($res);
<?php
function add($x,$y){
return $x+$y;
}
function reduce($x,$y){
return $x-$y;
}
echo call_user_func('add',3,2);
echo call_user_func('reduce',3,2);
echo call_user_func_array('add',array(3,2));
echo call_user_func_array('reduce',array(3,2));
- 匿名函数
- 闭包函数:临时创建的没有指定名称的函数。经常用作回调函数callback参数
- use引用一些页面变量
<?php
$message = "Hi";
$example = function() use(&$message){
echo $message;
};
$message = "Hello";
$example();
<?php $name = create_function('$a','echo $a;'); //参数列表 函数体 $name(1);
function test($name,Closure $clo){
echo $name;
$clo();
}
test("Tom",function(){
echo "Closure";
});
(6)函数复用
<?php
require('util.php');
include('util.php');
add(1,4);
- include_once require_once
<?php // require两次会报函数已经声明错误 //require('util.php'); //require('util.php'); require('util.php'); require_once('util.php'); // include两次会报函数已经声明错误 //include('util.php'); //include('util.php'); include('util.php'); include_once('util.php');
include('testa/t1.php');
include('testa/t2.php');
include('testb/t3.php');
include('testb/t4.php');
t1();
t2();
t3();
t4();
set_include_path(get_include_path().PATH_SePARATOR.'testa');
set_include_path(get_include_path().PATH_SePARATOR.'testb');
include(t1.php);
include(t2.php);
include(t3.php);
include(t4.php);
t1();
t2();
t3();
t4();
init_set('include_path',get_include_path().PATH_SePARATOR.'testb');
init_set('include_path',get_include_path().PATH_SePARATOR.'testb');
include(t1.php);
include(t2.php);
include(t3.php);
include(t4.php);
t1();
t2();
t3();
t4();
- restore_include_path();取消引用路径