1.回调函数

c语言中的回调函数:通过函数指针调用的函数。将函数a的指针(地址)作为参数传递给另一个函数b,当函数a的指针被b用来调用a时,这就是回调函数,在特定的事件或条件发生时,由另外一方调用,用于对该事件的响应(这个特别像观察者模式。。。)

php内置的函数call_user_func()和call_user_func_array()提供对回调函数的支持。

mixed call_user_func ( callable $callback [, mixed $parameter [, mixed$... ]] )

mixed call_user_func_array ( callable $callback , array $param_arr ),后者是将参数做为一个数组传递的

回调函数有3种类型:自定义的全局回调函数,类的静态方法,对象的方法,

一个已经实例化的对象的方法作为数组传递,下标为0的包含该对象,下标为1的包含方法名

静态类方法可不经实例化该类的对象而传递,下标为0的包含该类名,下标为1的包含方法名,或者‘ClassName::methodName’(从PHP5.2.3后开始支持)

可用create_function()来创建一个匿名回调函数。

<?php
function print_callback($vara, $varb){
echo "print_callback"."<br />";
echo '$vara = '.$vara."<br />";
echo '$varb = '.$varb."<br />";
}
$var1 = "fun1";
$var2 = "fun2";
call_user_func("print_callback", $var1, $var2);
call_user_func_array("print_callback", array($var1, $var2)); class MyClass{
static function myCallbackMethod(){
echo 'MyClass::myCallbackMethod is called<br />';
}
} call_user_func(array("MyClass", "myCallbackMethod")); $obj = new MyClass();
call_user_func(array($obj, "myCallbackMethod"));
call_user_func("MyClass::myCallbackMethod"); class A{
public static function who(){
echo 'A<br />';
}
}
class B extends A{
public static function who(){
echo 'B<br />';
}
}
call_user_func(array('B', "who"));
call_user_func(array('B', "parent::who"));
?>

  结果:

print_callback
$vara = fun1
$varb = fun2
print_callback
$vara = fun1
$varb = fun2
MyClass::myCallbackMethod is called
MyClass::myCallbackMethod is called
MyClass::myCallbackMethod is called
B
A

2.可变函数

类似于C,C++中的函数指针,这里对于函数名可以用一个变量来代替,变量的值即为函数名。形式:$varfun(...)。当然也适用于对象方法和静态类方法。

注意如果$varfun后没有括号,那么$varfun将会被当作普通变量使用,如果有括号,那么优先当作可变函数解释。

<?php
function foo(){
echo "foo<br />";
return "return foo <br />";
}
function hello(){
echo "hello <br />";
return "return hello <br />";
}
$var = "hello";
echo "echo var ".$var."<br />";
$var();
echo "echo var()".$var();
$var = "foo";
echo "echo var ".$var."<br />";
echo "echo var()".$var();
?>

  结果:

echo var hello
hello
hello
echo var()return hello
echo var foo
foo
echo var()return foo

3.匿名函数(闭包函数)

一个没有名称的函数。常用作回调函数参数的值,也可作为变量的值来使用,然后可以采用类似可变函数的调用方式,此时php会自动把此种表达式转换成内置类Closure

的对象实例。

<?php
$var = function(){
echo "hello world<br />";
}; echo preg_replace_callback('~-([a-z])~', function($match){
return strtoupper($match[1]);
}, 'hello-world');
echo "<br />";
$fruit = function($name){
printf("fruit name is %s\n<br />", $name);
}; $fruit('apple');
$fruit('orange'); ?>

结果:

helloWorld
fruit name is apple
fruit name is orange

4.作用域:

PHP中所有函数和类都有全局作用域,要求,一个类或者函数在使用前必须被定义。

5.函数的其他问题:

php不支持重载,不能取消定义或者重定义已声名的函数;

变量名大小写无关;

支持可变数量的参数和默认参数;

递归函数,避免调用层数超过100~200层,堆栈容易崩溃。

php学习小记1的更多相关文章

  1. mongodb入门学习小记

    Mongodb 简单入门(个人学习小记) 1.安装并注册成服务:(示例) E:\DevTools\mongodb3.2.6\bin>mongod.exe --bind_ip 127.0.0.1 ...

  2. javascript学习小记(一)

    大四了,课少了许多,突然之间就不知道学什么啦.整天在宿舍混着日子,很想学习就是感觉没有一点头绪,昨天看了电影激战.这种纠结的情绪让我都有点喘不上气啦!一点要找点事情干了,所以决定找个东西开始学习.那就 ...

  3. js 正则学习小记之匹配字符串

    原文:js 正则学习小记之匹配字符串 今天看了第5章几个例子,有点收获,记录下来当作回顾也当作分享. 关于匹配字符串问题,有很多种类型,今天讨论 js 代码里的字符串匹配.(因为我想学完之后写个语法高 ...

  4. js 正则学习小记之左最长规则

    原文:js 正则学习小记之左最长规则 昨天我在判断正则引擎用到的方法是用 /nfa|nfa not/ 去匹配 "nfa not",得到的结果是 'nfa'.其实我们的本意是想得到整 ...

  5. js 正则学习小记之NFA引擎

    原文:js 正则学习小记之NFA引擎 之前一直认为自己正则还不错,在看 次碳酸钴,Barret Lee 等大神都把正则玩的出神入化后发现我只是个战五渣.  求抱大腿,求大神调教. 之前大致有个印象,正 ...

  6. js 正则学习小记之匹配字符串优化篇

    原文:js 正则学习小记之匹配字符串优化篇 昨天在<js 正则学习小记之匹配字符串>谈到 个字符,除了第一个 个,只有 个转义( 个字符),所以 次,只有 次成功.这 次匹配失败,需要回溯 ...

  7. CSS学习小记

    搜狗主页页面CSS学习小记 1.边框的处理   要形成上图所示的布局效果,即,点选后,导航下面的边框不显示而其他的边框形成平滑的形状.相对于把导航的下面边框取消然后用空白覆盖掉下面搜索栏的边框比较而言 ...

  8. Gcd&Exgcd算法学习小记

    Preface 对于许多数论问题,都需要涉及到Gcd,求解Gcd,常常使用欧几里得算法,以前也只是背下来,没有真正了解并证明过. 对于许多求解问题,可以列出贝祖方程:ax+by=Gcd(a,b),用E ...

  9. logstash 学习小记

    logstash 学习小记 标签(空格分隔): 日志收集 Introduce Logstash is a tool for managing events and logs. You can use ...

  10. js 正则学习小记之匹配字符串字面量优化篇

    昨天在<js 正则学习小记之匹配字符串字面量>谈到 个字符,除了第一个 个,只有 个转义( 个字符),所以 次,只有 次成功.这 次匹配失败,需要回溯后用 [^"] 才能匹配成功 ...

随机推荐

  1. spring beans源码解读

    spring beans下面有如下源文件包: org.springframework.beans, 包含了操作java bean的接口和类.org.springframework.beans.anno ...

  2. 通知NSNotificationCenter

    注意:接受通知要写在 viewDidLoad 方法里面 取得系统全局的唯一广播站 NSNotificationCenter *notification = [NSNotificationCenter  ...

  3. office2016 部分截图

    哈啊哈哈啊哈 看看吧~~~~~~~~~~~~~~~~~

  4. iOS8上放大缩小的动画

    CGAffineTransformMakeScale这个方法我们以前经常使用,但是在IOS8上出现问题了 [UIView animateWithDuration:0.3 animations:^{ b ...

  5. JavaScript中===与==的区别

    参考网址:http://zhidao.baidu.com/link?url=RbWnRUHKPBTakwm2-iRfEDicrh4ZSAAeVfq2WvBkvfeLPkU-ZSqZ4chV8LWkCk ...

  6. 看看baidu是如何AJAX跨域的[转]

    看看baidu是如何AJAX跨域的 最近做个人网站遇到AJAX跨子域名的问题. 偶尔看到baidu的通行证处理都是在二级域名passport.baidu.com中处理的, 但是baidu很多地方登录都 ...

  7. [转载]C# 中对html 标签过滤

    private string FilterHTML(string html) { System.Text.RegularExpressions.Regex regex1 = new System.Te ...

  8. java多线程下载和断点续传

    java多线程下载和断点续传,示例代码只实现了多线程,断点只做了介绍.但是实际测试结果不是很理想,不知道是哪里出了问题.所以贴上来请高手修正. [Java]代码 import java.io.File ...

  9. [wikioi]合并果子

    http://wikioi.com/problem/1063/ 这题是贪心+堆.主要想练习一下堆的写法.算法导论里的方法名是heapify()等,但大家经常用更直观的down(), up()方法(向上 ...

  10. 弱安全协议探测工具-sslciphercheck

    SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为 网络通信提供安全及数据完整性的一种安全协议.TLS ...