文档章节

PHP常用函数篇

度_
 度_
发布于 07/17 09:46
字数 2497
阅读 9
收藏 0
PHP

1.为什么要使用函数?

除了内建的PHP函数,我们可以创建我们自己的函数。
    函数是可以在程序中重复使用的语句块。
    使代码逻辑更清晰
    避免过多的全局变量
    封装后避免相同逻辑重复代码,只需调用写好的函数即可
    便于维护,仅需修改函数逻辑即可完成所有调用该函数的逻辑修改,不需要多处修改
    页面加载时函数不会立即执行,函数只有在被调用时才会执行。

2.函数的结构分析

//定义函数
function aa (){
    //代码段
}
//调用函数
aa();

3.函数的命名规则
函数的命名规范和变量名的命名规范相同。通常函数都是执行一个动作的,因此函数命名时,一般函数中会包含动词

//这是一个简单的命名示例
function aa(){
    echo "this is function name aa";
}
aa();

4.函数的返回值

//用return实现返回
function fan($height,$width){
    $area=$height*$width;                    
    return $area;                            
}
$total=fan(4,3);                
echo $total  ;
//结果12,因为3*4=12

5.函数的形参与实参
形参是指function后面小括号里面的参数。
实参是指调用function函数的时候写的参数.


function abc($a) //这个$a是形参
{
 $a++;
 echo $a;
}
$a=2;
abc($a); //这个$a是实参 输出:3
echo $a;  //输出:2 因为传进abc里的是它的一副本 要想在函数内改变该值,可以用引用传递

6.函数的默认值
在php编程中,为自定义函数设定默认值,当用户调用该函数时,如果不给参数指定值,参数会用默认值顶替。

function printMe($param = NULL)
{
   print $param;
}
printMe("This is morenzhi function ");
printMe();

//This is morenzhi function


7.函数的强类型参数

function sum($a,$b)
{
        return $a+$b;
}
var_dump(sum(1,2));
var_dump(sum(1,2.5));
//int(3) float(3.5)

8.函数的可变参数列表

//必须在5.6以上版本才可以运行
function sum(...$numbers)
{
    $acc = 0;
    foreach( $numbers as $number )
    {
        $acc += $number;
    }
    return $acc;
}

echo sum(1,2,3,4);

//输出
//10

9.函数值传递与引用传递
    区别
        (1)按值传递:函数范围内对值的任何改变在函数外部都会被忽略
        (2)按引用传递:函数范围内对值的任何改变在函数外部也能反映出这些修改
    优缺点:
        A:按值传递时,php必须复制值。特别是对于大型的字符串和对象来说,这将会是一个代价很大的操作。
        B.按引用传递则不需要复制值,对于性能提高很有好处。

header('content-type:text/html;charset=utf-8');
$hero = array('no1'=>'蝙蝠侠', 'no2'=>'超人');

     $hero2 = &$hero;
     $hero2['no1'] = '蜘蛛侠';
     echo '<pre>';
     var_dump($hero);
     var_dump($hero2);
 
 
     $a = null;
     $b = &$a;
     $b = 'abc';
 
     var_dump($a, $b);

//结果
/*   array(2) {
        ["no1"]=>
        string(9) "蜘蛛侠"
        ["no2"]=>
        string(6) "超人"
      }
      array(2) {
        ["no1"]=>
        string(9) "蜘蛛侠"
        ["no2"]=>
        string(6) "超人"
      }
      string(3) "abc"
      string(3) "abc" */

10.函数变量作用域
在所有函数外定义的变量拥有全局作用域,在函数内部声明的变量是局部变量,仅能在函数内部访问。要在一个函数中使用全局变量,需要使用global关键字。

//使用global关键字  
<?php  
$x=10;  
$y=20;  
function test(){  
    global $x,$y;  
    $y=$x+$y;  
}  
test();  
echo $y;//输出30  

 

11.复杂函数-可变函数
如果一个变量名后面有括号,PHP将寻找与该变量值同名的函数,并且尝试执行它。PHP"可变函数"可以用来实现包括回调函数、函数表在内的一些用途。
”可变函数“不能用于语言结构,如echo(),print(),unset(),isset(),empty(),include(),require()等,需要使用自定义的包装函数来将这些结构用作可变函数。

function echoString($str){

      echo($str);

  }

 $varFun="echoString";

 $varFun=("Output String");//输出"Output String"

12.复杂函数-嵌套函数
嵌套函数,是一种有条件全局,你可以控制,在什么情况下提供这样的全局函数给用户使用。但也需要注意,过多的全局函数则会产生“全局污染”,所以,不可多用

function foo()
{
    function bar()
    {
    echo "this is qiantao function";
    }
}

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

foo();//结果空

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

bar();//结果this is qiantao function

 

13.复杂函数-递归函数
    什么是递归函数?
        一个函数在它的函数体内调用它自身称为递归调用。 这种函数称为递归函数。
    php 递归函数的三种实现方式


    (1).利用引用做参数
        函数之间本来也是各行其是,即便是同名函数。递归函数是考虑将引用作为参数,成为一个桥梁,形成两个函数间的数据共享。虽然两个函数见貌似操作的是不同地址,但是实际上操作的是一块儿内存地址

function test($a=0,&$result=array()){
    $a++;
    if ($a<10) {
        $result[]=$a;
        test($a,$result);
    }
    echo $a;
    return $result;
}

本例比较有意思的是 "echo $a" 的值。相信很多人认为是 12345678910 吧? 其实不然,是 1098765432。为什么呢?因为函数还没执行"echo $a "前就进行了下一次的函数递归。真正执行echo 是$a<10条件不满足的时候,echo 返回a,返回result, 对于上一层而言,执行完递归函数,开始执行本层的echo $a,依次类推。

 (2).利用全局变量
        利用全局变量完成递归函数,请确保你确实理解什么是全局变量。global在函数内申明变量不过是外部变量的同名引用。变量的作用范围仍然在本函数范围内。改变这些变量的值,外部同名变量的值自然也改变了。但一旦用了&(引用),同名变量不再是同名引用。利用全局变量实现递归函数没必要理解到这么深的一层,还保持原有对全局变量的看法就可以顺理成章理解递归函数。

function test1($a=0,$result=array()){
    global $result;
    $a++;
    if ($a<10) {
      $result[]=$a;
      test1($a,$result);
    }
    return $result;
}

    (3).利用静态变量
我们常常在类中见到static,今天我们把它利用到递归函数中。请记住static的作用:仅在第一次调用函数的时候对变量进行初始化,并且保留变量值。

function test(){
    static $count=0;
    echo $count;
    
    $count++;
}
test();
test();
test();
test();
test();

请问这一段代码的执行结果是多少?是 00000 么?必然不是。 是 01234。  首先第一次调用test(),   static对 $count 进行初始化,  其后每一次执行完都会保留 $count 的值,  不再进行初始化,相当于直接忽略了 static $count=0; 这一句。
因而将static应用到递归函数作用可想而知。在将需要作为递归函数间作为“桥梁"的变量利用static进行初始化,每一次递归都会保留"桥梁变量"的值。

function test3($a=0){
    static $result=array();
    $a++;
    if ($a<10) {
        $result[]=$a;
        test3($a);
    }
    return $result;
}

总结
所谓递归函数,重点是如何处理函数调用自身,是如何保证所需要的结果,得以在函数间合理"传递",当然也有不需要函数之间传值得递归函数

 

14. 复杂函数-匿名(闭包)函数
    匿名函数
        提到闭包就不得不想起匿名函数,也叫闭包函数(closures),貌似PHP闭包实现主要就是靠它。声明一个匿名函数是这样

$func = function() {
    
};//带结束符


可以看到,匿名函数因为没有名字,如果要使用它,需要将其返回给一个变量。匿名函数也像普通函数一样可以声明参数,调用方法也相同:

$func = function( $niming ) {
    echo $niming;
};

$func( 'this is niming function' );

//输出:this is niming function

 

 

    实现闭包
        将匿名函数在普通函数中当做参数传入,也可以被返回。这就实现了一个简单的闭包。
        

下边有三个例子

//例一
//在函数里定义一个匿名函数,并且调用它
function bibao() {
    $func = function( $str ) {
        echo $str;
    };
    $func( 'tihs is bibao' );
}

bibao();
//输出
//tihs is bibao
//例二
//在函数中把匿名函数返回,并且调用它
function getPrintStrFunc() {
    $func = function( $str ) {
        echo $str;
    };
    return $func;
}

$printStrFunc = getPrintStrFunc();
$printStrFunc( 'this is niming function fanhui' );

//输出
//this is niming function fanhui
//例三
//把匿名函数当做参数传递,并且调用它
function callFunc( $func ) {
    $func( 'this is niming function canshu chuandi' );
}

$printStrFunc = function( $str ) {
    echo $str;
};
callFunc( $printStrFunc );
//输出
//this is niming function canshu chuandi

//也可以直接将匿名函数进行传递。如果你了解js,这种写法可能会很熟悉
callFunc( function( $str ) {
    echo $str;
} );
//输出
//this is niming function canshu chuandi

 

连接闭包和外界变量的关键字:USE
    闭包可以保存所在代码块上下文的一些变量和值。PHP在默认情况下,匿名函数不能调用所在代码块的上下文变量,而需要通过使用use关键字。
    有人可能会想到,是否可以在匿名函数中改变上下文的变量,但我发现是不可以的:

function getMoney() {
    $rmb = 1;
    $func = function() use ( $rmb ) {
        echo $rmb;
        //把$rmb的值加1
        $rmb++;
    };
    $func();
    echo $rmb;
}

getMoney();

//输出:
//1
//1

原来use所引用的也只不过是变量的一个副本而已。但是我想要完全引用变量,而不是复制。
要达到这种效果,其实在变量前加一个 & 符号就可以了:

function getMoney() {
    $rmb = 1;
    $func = function() use ( &$rmb ) {
        echo $rmb;
        //把$rmb的值加1
        $rmb++;
    };
    $func();
    echo $rmb;
}

getMoney();

//输出:
//1
//2

 

 

 

 

 

本文转载自:https://segmentfault.com/a/1190000011807344

共有 人打赏支持
度_
粉丝 0
博文 40
码字总数 7455
作品 0
杭州
高级程序员
私信 提问
PHP 画图应用 验证码 柱状图

Title: PHP 画图应用 验证码 柱状图 Author: MoreWindows Blog: http://blog.csdn.net/MoreWindows KeyWord: PHP 验证码 柱状图 imagefilledarc 阅读本文之前,推荐先参阅姊妹篇《PHP 画图基...

彭博
2012/04/12
118
0
PHP常用函数篇

PHP常用函数篇 1.为什么要使用函数? 除了内建的PHP函数,我们可以创建我们自己的函数。 函数是可以在程序中重复使用的语句块。 使代码逻辑更清晰 避免过多的全局变量 封装后避免相同逻辑重复...

Besmall
2017/11/01
0
0
php&go&python&node

2016 第二届 PHP 全球开发者大会回顾(文末附演讲嘉宾所有资料下载) 继前年的 “PHP7 初探”、去年的“高性能的 PHP ” 主题后,2017 第三届 PHP 全球开发者大会的活动主题是“高可用的 PH...

掘金官方
2017/12/20
0
0
PHP 画图应用 验证码 柱状图

Title: PHP 画图应用 验证码 柱状图 Author: MoreWindows Blog: http://blog.csdn.net/MoreWindows KeyWord: PHP 验证码 柱状图 imagefilledarc 阅读本文之前,推荐先参阅姊妹篇《PHP 画图基...

长平狐
2012/12/10
110
0
Ajax & PHP 边学边练 之四 表单

通过上一篇文章已经了解到如何利用Ajax和PHP对数据库进行数据读取,这样可以动态的获取到数据库的最新数据。本篇则继续介绍通过表单(Form)向数据库中写入数据。 谈到Form就涉及到一个发送请...

junwong
2012/03/09
48
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周日乱弹 —— 钱不还,我就当你人不在了

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @莱布妮子 :分享Bigleaf的单曲《小鹿》 《小鹿》- Bigleaf 手机党少年们想听歌,请使劲儿戳(这里) 周日在家做什么? 做手工呀, @poorfis...

小小编辑
29分钟前
11
1
EOS docker开发环境

使用eos docker镜像是部署本地EOS开发环境的最轻松愉快的方法。使用官方提供的eos docker镜像,你可以快速建立一个eos开发环境,可以迅速启动开发节点和钱包服务器、创建账户、编写智能合约....

汇智网教程
今天
17
0
《唐史原来超有趣》的读后感优秀范文3700字

《唐史原来超有趣》的读后感优秀范文3700字: 作者:花若离。我今天分享的内容《唐史原来超有趣》这本书的读后感,我将这本书看了一遍之后就束之高阁了,不过里面的内容一直在在脑海中回放,...

原创小博客
今天
20
0
IC-CAD Methodology知识图谱

CAD (Computer Aided Design),计算机辅助设计,指利用计算机及其图形设备帮助设计人员进行设计工作,这个定义同样可以用来近似描述IC公司CAD工程师这个岗位的工作。 早期IC公司的CAD岗位最初...

李艳青1987
今天
24
0
CompletableFuture get方法一直阻塞或抛出TimeoutException

问题描述 最近刚刚上线的服务突然抛出大量的TimeoutException,查询后发现是使用了CompletableFuture,并且在执行future.get(5, TimeUnit.SECONDS);时抛出了TimeoutException异常,导致接口响...

xiaolyuh
今天
11
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部