代码改变世界

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层,堆栈容易崩溃。