php学习小记1
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的更多相关文章
- mongodb入门学习小记
Mongodb 简单入门(个人学习小记) 1.安装并注册成服务:(示例) E:\DevTools\mongodb3.2.6\bin>mongod.exe --bind_ip 127.0.0.1 ...
- javascript学习小记(一)
大四了,课少了许多,突然之间就不知道学什么啦.整天在宿舍混着日子,很想学习就是感觉没有一点头绪,昨天看了电影激战.这种纠结的情绪让我都有点喘不上气啦!一点要找点事情干了,所以决定找个东西开始学习.那就 ...
- js 正则学习小记之匹配字符串
原文:js 正则学习小记之匹配字符串 今天看了第5章几个例子,有点收获,记录下来当作回顾也当作分享. 关于匹配字符串问题,有很多种类型,今天讨论 js 代码里的字符串匹配.(因为我想学完之后写个语法高 ...
- js 正则学习小记之左最长规则
原文:js 正则学习小记之左最长规则 昨天我在判断正则引擎用到的方法是用 /nfa|nfa not/ 去匹配 "nfa not",得到的结果是 'nfa'.其实我们的本意是想得到整 ...
- js 正则学习小记之NFA引擎
原文:js 正则学习小记之NFA引擎 之前一直认为自己正则还不错,在看 次碳酸钴,Barret Lee 等大神都把正则玩的出神入化后发现我只是个战五渣. 求抱大腿,求大神调教. 之前大致有个印象,正 ...
- js 正则学习小记之匹配字符串优化篇
原文:js 正则学习小记之匹配字符串优化篇 昨天在<js 正则学习小记之匹配字符串>谈到 个字符,除了第一个 个,只有 个转义( 个字符),所以 次,只有 次成功.这 次匹配失败,需要回溯 ...
- CSS学习小记
搜狗主页页面CSS学习小记 1.边框的处理 要形成上图所示的布局效果,即,点选后,导航下面的边框不显示而其他的边框形成平滑的形状.相对于把导航的下面边框取消然后用空白覆盖掉下面搜索栏的边框比较而言 ...
- Gcd&Exgcd算法学习小记
Preface 对于许多数论问题,都需要涉及到Gcd,求解Gcd,常常使用欧几里得算法,以前也只是背下来,没有真正了解并证明过. 对于许多求解问题,可以列出贝祖方程:ax+by=Gcd(a,b),用E ...
- logstash 学习小记
logstash 学习小记 标签(空格分隔): 日志收集 Introduce Logstash is a tool for managing events and logs. You can use ...
- js 正则学习小记之匹配字符串字面量优化篇
昨天在<js 正则学习小记之匹配字符串字面量>谈到 个字符,除了第一个 个,只有 个转义( 个字符),所以 次,只有 次成功.这 次匹配失败,需要回溯后用 [^"] 才能匹配成功 ...
随机推荐
- Django数据操作
1.一个模型类代表数据库中的一个表,一个模型类的实例代表这个数据库表中的一条特定的记录. 2.管理器和查询集. 查询集QuerySet表示从数据库中取出来的对象的集合.它可以含有零个.一个或者多个过滤 ...
- 转:jQuery.fn.extend与jQuery.extend到底区别在哪?
还是先吐个槽,网上都都是转载抄袭,基本上就那么一两篇文章,说的还不清楚.... 正文: 其实说白了,从两个方法本身就能看出来端倪. 我们先把jQuery看成了一个类,这样好理解一些. jQuery.e ...
- hadoop-streaming 配置之---参数分割
map: -D stream.map.output.field.separator=. 定义mapoutput字段的分隔符为. 用户可以自定义分隔符(除了默认的tab) -D stream.num.m ...
- CSS content内容生成技术以及应用(转)
一.哗啦哗啦的简介 zxx://这里“哗啦哗啦”的作用是为了渲染一种氛围.content属性早在 CSS2.1的时候就被引入了,可以使用:before以及:after伪元素生成内容.此特性目前已被大部 ...
- JS数组整理
1. 检测数组的方法: 1. instanceof[操作符]: var arr = []; console.log(arr instanceof Array);//true 1. instanceof ...
- single page
http://msdn.microsoft.com/zh-cn/magazine/cc507641.aspx#S7 http://blog.nodejitsu.com/scaling-isomorph ...
- Design Tutorial: Make It Nondeterministic
Codeforces Round #270:C;http://codeforces.com/contest/472 题意:水题 题解:贪心即可. #include<iostream> #i ...
- ZOJ 2110 Tempter of the Bone(DFS)
点我看题目 题意 : 一个N×M的迷宫,D是门的位置,门会在第T秒开启,而开启时间小于1秒,问能否在T秒的时候到达门的位置,如果能输出YES,否则NO. 思路 :DFS一下就可以,不过要注意下一终止条 ...
- Java泛型反射机制(一)
/** * * @author Administrator * 功能:泛型的必要性(参数化类型)(安全简单) */ package com.test; import java.util.*; publ ...
- 自定义NavigationView's item 的高度
http://stackoverflow.com/questions/31204320/how-can-i-change-the-navigationviews-item-text-size 自定义s ...