一、函数定义及变量作用域

1. 函数的声明和调用

函数的目的是复用。

[$variable=] function [name]([$param]){}

2. 变量的作用域

(1) 全局变量

函数内部想访问函数外部的变量(对其操作),需要加上global 或者使用$GLOBALS[variable_name]

$var = 1;
function fn() {
//echo $var;//error
//echo global $var;
$GLOBALS['var']++;
}
fn(); echo $var; //2

(2) 局部变量

函数内部的变量,不能在函数 外访问。

function fn() {
$var = '123';
} echo $var; // error

(3) 超级全局变量

  • $GLOBALS
  • $_SERVER
  • $_GET
  • $_POST
  • $_FILE

超全局作用域

  • $_COOKIE
  • $_SESSION
  • $_REQUEST
function getInfo () {
$username = $_POST['username'];
echo $username;
}
getInfo();

二、函数的参数与返回值

1. 自定义函数参数

function fn($x) {
echo $x;
}

2. 自定义函数的形参和实参

调用的时候是实参,函数声明的时候是形参

$x = 1;
function fn($x) {
echo $x;
}
fn($x);

3. 值传递

值传递的变量是不会变化。

$x = 1;
function fn($x) {
return $x++;
}
fn($x);
echo $x; // 1

4. 引用传递

引用传递,如果函数内部改变了变量值,再调用之后,变量的值也随之变化。

$x = 1;
function fn(&$x) {
return $x++;
}
fn($x);
echo $x; // 2

ps : 需要说明的引用传递,不在乎变量是什么类型。这点和Javascript不太一样,Javascript的引用传递,必须是引用类型的变量(即对象,除null)。

5. 可变数量的参数

有些函数的参数是可变的,在PHP中实现这一目的,常使用:

  • func_get_args
  • func_get_arg
  • func_num_args

在PHP 5.6+ 使用...

function fn(...$args) {
print_r($args);
}

其中 $args 是一个参数的数组,类似javascript的函数内部arguments

6. 返回值

  1. 执行到return函数立刻跳出该函数。
function fn() {
echo 1;
if(true) {
return;
}
echo 2;
}
fn(); // 没有打印2
  1. 没有return的函数,返回Null
function fn() {
} var_dump(fn());

三、复杂函数

1. 匿名函数

$greet = function() {
echo `hello`;
}

(1) 回调函数

回调函数是指:一个函数作为另一个函数在调用时的参数的函数。

function cube($n) {
echo $n.'的三次方:'.($n*$n*$n);
}
call_user_func('cube',5);

或者原型的形态

call_user_func(function ($n) {
echo $n.'的三次方:'.($n*$n*$n);
},5);

2. 内部函数及有条件函数

(1) 内部函数

  • 内部函数指在函数内部声明的函数。
  • 内部函数的使用要在其外部函数声明之后,才能使用。
function fn_out() {
fn_in() {
echo 'in';
}
} //fn_in(); //error
fn_out();
fn_in(); // in

(2) 条件函数

if(true) {
function a(){
echo 1;
}
}
a(); if(false) {
function b(){
echo 1;
}
} b(); // error

3. 递归函数

  • 每一次调用更加接近解
  • 必须有个一个终止处理或计算的准则
function sum($num) {
if($num === 0) {
return;
}
return $num + sum($num - 1);
} echo sum(100);

4. 可变函数

可变函数是指如果一个变量后有圆括号,php将寻找与变量的值同名的函数,并且擦汗功能是执行它。

$str = 'strtolower';
echo $str('ABC');// abc

可变函数不能用于,例如echo,print,unset,isset,empty,include,require以及类似的语言解构。

__FUNCTION__ 获取函数名称

function sum($num) {
$func = __FUNCTION__;
if($num === 0) {
return;
}
return $num + $func($num - 1);
} echo sum(100);sum(100);

php 的函数的更多相关文章

  1. Python 小而美的函数

    python提供了一些有趣且实用的函数,如any all zip,这些函数能够大幅简化我们得代码,可以更优雅的处理可迭代的对象,同时使用的时候也得注意一些情况   any any(iterable) ...

  2. 探究javascript对象和数组的异同,及函数变量缓存技巧

    javascript中最经典也最受非议的一句话就是:javascript中一切皆是对象.这篇重点要提到的,就是任何jser都不陌生的Object和Array. 有段时间曾经很诧异,到底两种数据类型用来 ...

  3. JavaScript权威指南 - 函数

    函数本身就是一段JavaScript代码,定义一次但可能被调用任意次.如果函数挂载在一个对象上,作为对象的一个属性,通常这种函数被称作对象的方法.用于初始化一个新创建的对象的函数被称作构造函数. 相对 ...

  4. C++对C的函数拓展

    一,内联函数 1.内联函数的概念 C++中的const常量可以用来代替宏常数的定义,例如:用const int a = 10来替换# define a 10.那么C++中是否有什么解决方案来替代宏代码 ...

  5. 菜鸟Python学习笔记第一天:关于一些函数库的使用

    2017年1月3日 星期二 大一学习一门新的计算机语言真的很难,有时候连函数拼写出错查错都能查半天,没办法,谁让我英语太渣. 关于计算机语言的学习我想还是从C语言学习开始为好,Python有很多语言的 ...

  6. javascript中的this与函数讲解

    前言 javascript中没有块级作用域(es6以前),javascript中作用域分为函数作用域和全局作用域.并且,大家可以认为全局作用域其实就是Window函数的函数作用域,我们编写的js代码, ...

  7. 复杂的 Hash 函数组合有意义吗?

    很久以前看到一篇文章,讲某个大网站储存用户口令时,会经过十分复杂的处理.怎么个复杂记不得了,大概就是先 Hash,结果加上一些特殊字符再 Hash,结果再加上些字符.再倒序.再怎么怎么的.再 Hash ...

  8. JS核心系列:浅谈函数的作用域

    一.作用域(scope) 所谓作用域就是:变量在声明它们的函数体以及这个函数体嵌套的任意函数体内都是有定义的. function scope(){ var foo = "global&quo ...

  9. C++中的时间函数

    C++获取时间函数众多,何时该用什么函数,拿到的是什么时间?该怎么用?很多人都会混淆. 本文是本人经历了几款游戏客户端和服务器开发后,对游戏中时间获取的一点总结. 最早学习游戏客户端时,为了获取最精确 ...

  10. Python高手之路【四】python函数装饰器

    def outer(func): def inner(): print('hello') print('hello') print('hello') r = func() print('end') p ...

随机推荐

  1. Java知多少(77)日期和时间类

    Java 的日期和时间类位于 java.util 包中.利用日期时间类提供的方法,可以获取当前的日期和时间,创建日期和时间参数,计算和比较时间. Date 类 Date 类是 Java 中的日期时间类 ...

  2. Redis系统性介绍

    虽然Redis已经很火了,相信还是有很多同学对Redis只是有所听闻或者了解并不全面,下面是一个比较系统的Redis介绍,对Redis的特性及各种数据类型及操作进行了介绍.是一个很不错的Redis入门 ...

  3. java.sql.SQLException: ORA-01578: ORACLE 数据块损坏问题解决办法

    错误信息: java.sql.SQLException: ORA-01578: ORACLE 数据块损坏 (文件号 17, 块号 315703) ORA-01110: 数据文件 17: 'D:\ORA ...

  4. Spring源码学习:day2

    前言: 我还是太懒了,连截图都懒得粘贴,故直接用书上说的话的截图吧. 代码的编写过程都是应该有一个入口的,所有的代码最终都是为了那个入口更加方便更加简单而产生的. 看代码的过程,就应该抓住主线,顺着主 ...

  5. 仿照支付宝账单界面--listview分组显示 用来做!发!财树充值交易明细

    QQ图片20150430155638.png (151.65 KB, 下载次数: 32)     下载链接: http://pan.baidu.com/s/1kVMY1SV 密码: i8ta

  6. 05原型模式Prototype

    一.什么是原型模式 Prototype模式是一种对象创建型模式,它采 取复制原型对象的方法来创建对象的实例.使用 Prototype模式创建的实例,具有与原型一样的 数据. 二.原型模式的特点 1. ...

  7. 大杂烩 -- 简析TCP的三次握手与四次分手

    基础大杂烩 -- 目录 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- - ...

  8. Flv的结构分析

    Flv是网络上流行的非常广的一种媒体格式,很多大型媒体网站都在使用这种格式承载音视频信息,比如优酷等网站. Flv文件格式相对而言还是比较简单的,主要是由两部分组成 FLV header FLV bo ...

  9. C++/MFC-线程优先级

    转载: https://blog.csdn.net/qwdpoiguw/article/details/72830426 一.线程优先级(Thread priority ) 简单的说就是(线程)的优先 ...

  10. Linux Platform驱动模型(三) _platform+cdev

    平台总线是一种实现设备信息与驱动方法相分离的方法,利用这种方法,我们可以写出一个更像样一点的字符设备驱动,即使用cdev作为接口,平台总线作为分离方式: xjkeydrv_init():模块加载函数 ...