前端学PHP之函数
前面的话
PHP 的真正力量来自它的函数:它拥有超过 1000 个内建的函数。本文将详细介绍php函数
[注意]关于javascript函数的详细内容移步至此
函数定义
除了内建的 PHP 函数,可以创建我们自己的函数。函数是可以在程序中重复使用的语句块。页面加载时函数不会立即执行。函数只有在被调用时才会执行。
用户定义的函数声明以关键字 "function" 开头,函数名和 PHP 中的其它标识符命名规则相同。有效的函数名以字母或下划线打头,后面跟字母,数字或下划线
function functionName() {
被执行的代码;
}
<?php
function writeMsg() {
echo "Hello world!";
}
writeMsg(); // 调用函数
?>
函数参数
可以通过参数向函数传递信息,参数类似变量。参数被定义在函数名之后,括号内部。可以添加任意多参数,只要用逗号隔开即可
<?php
function familyName($fname) {
echo "$fname Zhang.<br>";
} familyName("Li");
familyName("Hong");
familyName("Tao");
familyName("Xiao Mei");
familyName("Jian");
?>
引用传递
默认情况下,函数参数通过值传递。如果希望允许函数修改它的参数值,必须通过引用传递参数
如果想要函数的一个参数总是通过引用传递,可以在函数定义中该参数的前面加上符号 &
<?php
function add_some_extra(&$string)
{
$string .= 'and something extra.';
}
$str = 'This is a string, ';
add_some_extra($str);
echo $str; // outputs 'This is a string, and something extra.'
?>
默认参数
函数可以定义 C++ 风格的标量参数默认值
<?php
function setHeight($minheight=50) {
echo "The height is : $minheight <br>";
} setHeight(350);
setHeight(); // 将使用默认值 50
setHeight(135);
setHeight(80);
?>
PHP 还允许使用数组 array 和特殊类型 NULL 作为默认参数
<?php
function makecoffee($types = array("cappuccino"), $coffeeMaker = NULL)
{
$device = is_null($coffeeMaker) ? "hands" : $coffeeMaker;
return "Making a cup of ".join(", ", $types)." with $device.\n";
}
echo makecoffee();
echo makecoffee(array("cappuccino", "lavazza"), "teapot");
?>
[注意]当使用默认参数时,任何默认参数必须放在任何非默认参数的右侧;否则,函数将不会按照预期的情况工作
可变参数
【func_get_args()】
func_get_args()相当于javascript函数中的arguments,以数组形式保存着实参
function demo(){
$arr = func_get_args();
$sum = 0;
for($i = 0; $i<count($arr); $i++){
$sum += $arr[$i];
}
return $sum;
}
//
echo demo(1,2,3,4,5,6,7,8,9);
此外,还有两个常用的函数func_num_args()和func_get_arg()
func_num_args()函数返回参数总数
func_get_arg()函数接收一个数字参数,返回指定参数
function more_args() {
for($i=0; $i<func_num_args(); $i++) {
echo "第".$i."个参数是".func_get_arg($i)."<br>";
}
}
more_args("one", "two", "three", 1, 2, 3);
返回值
如需使函数返回值,使用 return 语句。如果省略了return,则返回值为 NULL
<?php
function sum($x,$y) {
$z=$x+$y;
return $z;
} echo "5 + 10 = " . sum(5,10) . "<br>";
echo "7 + 13 = " . sum(7,13) . "<br>";
echo "2 + 4 = " . sum(2,4);
?>
变量函数
变量函数也叫可变函数。如果一个变量名后有圆括号,PHP 将寻找与变量的值同名的函数,并且尝试执行它。可变函数可以用来实现包括回调函数,函数表在内的一些用途
[注意]可变函数不能用于例如 echo,print,unset(),isset(),empty(),include,require 以及类似的语言结构。需要使用自己的包装函数来将这些结构用作可变函数
<?php
function foo() {
echo "In foo()<br />\n";
} function bar($arg = '') {
echo "In bar(); argument was '$arg'.<br />\n";
} // 使用 echo 的包装函数
function echoit($string)
{
echo $string;
} $func = 'foo';
$func(); // This calls foo() $func = 'bar';
$func('test'); // This calls bar() $func = 'echoit';
$func('test'); // This calls echoit()
?>
回调函数
回调函数是指将一个函数的函数名作为参数传到另一个函数中
function demo($num,$n){
for($i=0;$i<$num;$i++){
if($n($i)){
echo $i.'<br>';
}
}
}
function test($i){
if($i%5){
return true;
}
}
demo(20,'test');
call_user_func_array
使用call_user_func_array可以调用回调函数,并把一个数组参数作为回调函数的参数
mixed call_user_func_array ( callable $callback , array $param_arr )
把第一个参数作为回调函数(callback)调用,把参数数组作(param_arr)为回调函数的的参数传入
function demo($num,$n){
for($i=0;$i<$num;$i++){
if(call_user_func_array($n,array($i))){
echo $i.'<br>';
}
}
}
function test($i){
if($i%5){
return true;
}
}
demo(20,'test');
实现回调函数时,通常要使用call_user_func_array()函数,而不是变量函数,因为变量函数无法传递对象中的方法或和类中的静态方法
function demo($num, $n) {
for($i=0; $i<$num; $i++) {
if(call_user_func_array($n, array($i))){
echo $i."<br>";
}
}
}
class Filter {
function one($i) {
if($i%3==0) {
return true;
}
}
static function two($i) {
if(preg_match('/3/', $i)) {
return true;
}
}
}
demo(500, array(new Filter(), "one"));
demo(500, array("Filter", "two"));
递归函数
在函数中调用自己就是递归函数
<?php
function test( $n ) {
echo $n;
if($n>0){
test($n-1);
}
echo $n;
}
test(5);//
?>
加载函数库
使用include()函数来引入外部文件
test.php
function one(){
echo '111';
} <?php
include ('test.php');
one();//
?>
但如果不慎引入多次,使得函数重定义,变量重新赋值,会造成错误
test.php
function one(){
echo '111';
} <?php
include ('test.php');
include ('test.php');
one();//
?>
此时,需要使用include_once()函数,来保证相同的文件只被引入一次
test.php
function one(){
echo '111';
} <?php
include_once('test.php');
include_once('test.php');
one();//
?>
require()
引入外部文件,还可以使用require()。include( )与require( )几乎等价,区别在于当处理失败时,include( )产生一个警告而require( )则导致一个致命错误
[注意]require_once()与include()_once也类似
匿名函数
匿名函数(Anonymous functions),也叫闭包函数(closures),允许临时创建一个没有指定名称的函数。最经常用作回调函数(callback)参数的值
其实,php的匿名函数类似于javascript中的函数表达式
[注意]匿名函数结尾一定要加分号,否则会报错
<?php
$greet = function($name)
{
printf("Hello %s\r\n", $name);
}; $greet('World');
$greet('PHP');
?>
闭包
PHP闭包实现主要就是靠匿名函数
将匿名函数在普通函数中当做参数传入,也可以被返回。这就实现了一个简单的闭包。
闭包的两个特点:
1、作为一个函数变量的一个引用 - 当函数返回时,其处于激活状态。
2、一个闭包就是当一个函数返回时,一个没有释放资源的栈区。
其实上面两点可以合成一点,就是闭包函数返回时,该函数内部变量处于激活状态,函数所在栈区依然保留
闭包可以从父作用域中继承变量。 任何此类变量都应该用 use 语言结构传递进去
$message = 'hello';
$example = function () use ($message) {
var_dump($message);
};
echo $example();//string 'hello' (length=5)
前端学PHP之函数的更多相关文章
- 从头开始学JavaScript (七)——函数
原文:从头开始学JavaScript (七)--函数 一.return 函数在执行完return之后停止并立即退出. return返回值:与return: 如下两个例子: function sum(n ...
- 前端学做 PPT
前端学做 PPT 公司做技术分享.年终总结都需要用到ppt. 要快速.省事的做出高质量的 ppt,一方面需要熟练使用制作 ppt 的工具,另一方面得知道用工具做成什么样子才是好作品.前者比较简单,后者 ...
- 前端学PHP之字符串函数
× 目录 [1]特点 [2]输出 [3]空格[4]大小写[5]HTML[6]格式化[7]比较 前面的话 字符串的处理和分析在任何编程语言中都是一个重要的基础,往往是简单而重要的.信息的分类.解析.存储 ...
- 前端学PHP之数组函数
× 目录 [1]键值操作 [2]记数[3]回调函数[4]组合[5]栈和队列[6]顺序 前面的话 PHP中的数组功能非常强大,数组处理函数有着强大.灵活.高效的特点.PHP5提供了近100个操作数组的系 ...
- 前端学PHP之正则表达式函数
前面的话 正则表达式不能独立使用,它只是一种用来定义字符串的规则模式,必须在相应的正则表达式函数中应用,才能实现对字符串的匹配.查找.替换及分割等操作.前面介绍了正则表达式的基础语法,本文将详细介绍正 ...
- 前端学HTTP之网络基础
× 目录 [1]网络 [2]OSI [3]TCP/IP 前面的话 HTTP协议对于前端工程师是非常重要的.我们在浏览网站时,访问的每一个WEB页面都需要使用HTTP协议实现.如果不了解HTTP协议,就 ...
- 前端学习之回调函数、call方法、apply方法
今天学习的内容比较少,大部分时间是自己在写qq音乐和京东移动端的页面.现在说说今天学到的内容: 首先,回调函数,就是在函数内部中调用另外一个函数, 将一个函数当作参数传给另一个函数,被传的函数叫做回调 ...
- 我也要学iOS逆向工程--函数
大家好,这篇我开始学习函数了.先学 C 函数,然后再 OC 的吧.OC 应该复杂点的吧. 然后看看汇编情况哦! 学习函数呢,肯定要弄清楚几个事情. 1.跳转地址. 2.返回地址 3.参数 4.函数获取 ...
- 前端学PHP之自定义模板引擎
前面的话 在大多数的项目组中,开发一个Web程序都会出现这样的流程:计划文档提交之后,前端工程师制作了网站的外观模型,然后把它交给后端工程师,它们使用后端代码实现程序逻辑,同时使用外观模型做成基本架构 ...
随机推荐
- Mac无法写入移动硬盘
1.使用mac 磁盘工具,格式化移动硬盘 频繁穿插于mac于pc之间者,大批量拷贝大型文件者,请用exfat 首先,排除Fat32,虽然这是兼容性最好的文件格式,但一个不支持4g以上文件的格式(现在随 ...
- js实现阶乘
//while循环实现function calNum(n) { var product = 1; while(n > 1){//1*5*4*3*2,1*n*(n-1)*(n-2)*...*2 p ...
- JS生成随机字符串
function randomString(len) { len = len || 32; var $chars = 'ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxy ...
- swift-Array(数组)
Swift 数组用于存储相同类型的值的顺序列表.Swift 要严格检查,不允许不同类型的值在同一个数组中 声明一个数组 var someArray = [SomeType]() var someArr ...
- 【Linux】crontab 定时任务
7月份,公司海外运营国发生数据库联接未释放,造成连接池连接不足的情况, 当时查询并没有及时解决问题, 为了避免现场同事多次人工重启系统的,因此写了个shell脚本,通过crontab 实现系统重启,但 ...
- 说说js作用域
开始就来说说作用域这个蛋疼的东西.里面可能会出现各种的问题 .先给一个简单的例子大家猜猜结果是什么 var a="b"; function text(){ alert(a);v ...
- SubVersion Ubuntu
UbuntuサーバにSubversionを入れる Linux, 開発ツール | Ubuntuサーバが無事に動いたので.続いてSubversionを入れてみる. こんな感じの環境を考える. Apa ...
- BJITJobs : 北京IT圈高端职位招聘信息,成功率最高的高端求职渠道
你有实力,但比你差的人都升了,你的师弟都年薪50万了,你还是找不到机会.为什么你离高端机会总是差一步呢?其实你离成功就差一次机会,一个适合你的高端职位的信息! 招聘网站不靠谱:三大网站都是低端职位为主 ...
- <十六>JDBC_使用 DBUtils 编写通用的DAO
接口 : DAO<T>.java import java.sql.Connection;import java.sql.SQLException;import java.util.List ...
- 欢迎进入MyKTV前后台点歌系统展示
一个项目,一分收获:一个项目,一些资源.Ktv项目也是一样的,所以我想分享我的收获,让你们获得你需要的资源. 一. 那MyKTV点歌系统具体的功能有哪些呢?我们就来看看吧! 1.MyKTV前台功能: ...