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. Java学习--String、StringBuffer与StringBuilder

    String并不是基本数据类型,而是一个对象,并且是不可变的对象.String类为final型的不可被继承,而且通过查看JDK文档会发现几乎每一个修改String对象的操作,实际上都是创建了一个全新的 ...

  2. MVC-登录并设置角色

    1.新建一个类,设置角色: using System; using System.Collections.Generic; using System.Linq; using System.Text; ...

  3. 一步步学习NHibernate(4)——多对一,一对多,懒加载(1)

    请注明转载地址:http://www.cnblogs.com/arhat 通过上一章的学习,我们学会如何使用NHibernate对数据的简单查询,删除,更新和插入,那么如果说仅仅是这样的话,那么NHi ...

  4. android正在运行进程和后台缓存进程的区别

    正在运行的进程:需要占用一定的cpu资源和RAM(内存)空间,多少的话看是什么应用,要消耗一定的电量,影响手机速度等性能. 后台缓存的进程:不需要占用cpu资源,会在RAM中写入一部分数据,当下次打开 ...

  5. 服务器环境搭建系列(二)-Tomcat篇

    1.解压缩Tomcat的tar包,默认放在opt下 tar -zxvf apache-tomcat-6.0.35.tar.gz 2.输入如下命令修改tomcat配置文件 vi /opt/apache- ...

  6. 转:Java Annotation详解

    转载自:http://william750214.javaeye.com/blog/298104 元数据的作用 如果要对于元数据的作用进行分类,目前还没有明确的定义,不过我们可以根据它所起的作用,大致 ...

  7. vs运行代码版本不一致删除缓存

    C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files

  8. 对于shell脚本参数获取时的一点小技巧

    问题如下: 根据脚本参数的个数$#进行一个循环,在依次输出每个参数$1 $2 $3...... 我有一个循环变量i $i 取到这时的i为1,我想使用这个1再去调用$1,也是就是打印出第一个参数 就是$ ...

  9. PHP漏洞全解(六)-跨网站请求伪造

    本文主要介绍针对PHP网站的跨网站请求伪造.在CSRF所有攻击方式中包含攻击者伪造一个看起来是其他用户发起的HTTP 请求,事实上,跟踪一个用户发送的HTTP请求才是攻击者的目的. CSRF(Cros ...

  10. csuoj 1352: New Sorting Algorithm

    因为每个元素都是移动到比它小1位的元素的后面: 这样的话以后的一定就可以把他们两个打包: 所以用这种方法最多扫一遍就可以了: 但是最小的那个数要不要移动呢? 如果最小的数后面的数都是升序的,那么一直扫 ...