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 正则学习小记之匹配字符串字面量>谈到 个字符,除了第一个 个,只有 个转义( 个字符),所以 次,只有 次成功.这 次匹配失败,需要回溯后用 [^"] 才能匹配成功 ...
随机推荐
- hdu 5646 DZY Loves Partition 二分+数学分析+递推
链接:http://acm.hdu.edu.cn/showproblem.php?pid=5646 题意:将n分成k个正整数之和,要求k个数全部相同:并且这k个数的乘积最大为多少?结果mod 1e^9 ...
- C# Windows Service调用IBM Lotus Notes发送邮件
近日研究了下IBM Lotus Mail,这货果然是麻烦,由于公司策略,没有开放smtp,很多系统邮件都没有办法发送,于是入手google学习Lotus Mail,想做成Windows服务,提供wcf ...
- [转载]MongoDB学习 (五):查询操作符(Query Operators).1st
本文地址:http://www.cnblogs.com/egger/archive/2013/05/04/3059374.html 欢迎转载 ,请保留此链接๑•́ ₃•̀๑! 查询操作符(Quer ...
- Sql狗血的Bit类型赋值与取值
Bit 数据类型在 SQL Server 数据库中以存储 1.0 进行存储. 往数据库中添加,修改 bit 类型的字段时,只能用 0 或者 1. 关于修改 Bit 类型的字段 1.若使用 SQL 语句 ...
- 如何用CURL并解释JSON
CURL *curl; CURLcode res; struct curl_slist *headers=NULL; // init to NULL is important headers = cu ...
- 《ArcGIS Engine+C#实例开发教程》第二讲 菜单的添加及其实现
原文:<ArcGIS Engine+C#实例开发教程>第二讲 菜单的添加及其实现 摘要:在上一讲中,我们实现了应用程序基本框架,其中有个小错误,在此先跟大家说明下.在“属性”选项卡中,我们 ...
- .Net remoting, Webservice,WCF,Socket区别
传统上,我们把计算机后台程序(Daemon)提供的功能,称为"服务"(service).比如,让一个杀毒软件在后台运行,它会自动监控系统,那么这种自动监控就是一个"服务& ...
- Form – 保存自動關閉當前窗口
FAQ: 在BUTTON的触发器中,写如下代码, commit_form; go_bloack('你想显示的那个window的block'); --或者写 show_view('你要显示的canvas ...
- 简单的信誉算法 js处理
$(document).ready(function(){ // 初始化 var credit = "{sh:$info.credit}"; var res = getCredit ...
- 生成Excel錯誤 遠端程序呼叫失敗。 (發生例外狀況於 HRESULT: 0x800706BE)
错误信息:详细信息:检索 COM 类工厂中 CLSID 为 {00024500-0000-0000-C000-000000000046} 的组件时失败,原因是出现以下错误: 80070005.网上找到 ...