• 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
    <br />", $name);
    };
    
    $fruit('apple');
    $fruit('orange');
    
    ?>

    结果:

    helloWorld
    fruit name is apple 
    fruit name is orange 

    4.作用域:

    PHP中所有函数和类都有全局作用域,要求,一个类或者函数在使用前必须被定义。

    5.函数的其他问题:

    php不支持重载,不能取消定义或者重定义已声名的函数;

    变量名大小写无关;

    支持可变数量的参数和默认参数;

    递归函数,避免调用层数超过100~200层,堆栈容易崩溃。

  • 相关阅读:
    聊聊自定义实现的SPI如何与spring进行整合
    聊聊读源码这件事
    聊聊自定义SPI如何使用自定义标签注入到spring容器中
    聊聊如何自定义数据脱敏
    聊聊自定义SPI如何与sentinel整合实现熔断限流
    排查not eligible for getting processed by all BeanPostProcessors
    SqlServer 数据脱敏脚本
    WPF 窗体使用 Show() 单个显示并设置弹窗相对于主窗体位置
    【SQLite】获取插入 ID 的几种方式
    Winform DataGridView 行单元格增加自定义 ToolTip
  • 原文地址:https://www.cnblogs.com/bootstar/p/3444416.html
Copyright © 2020-2023  润新知