php学习小记1
2013-11-26 22:20 bootstar 阅读(165) 评论(0) 编辑 收藏 举报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层,堆栈容易崩溃。