• func_get_arg、func_get_args、func_num_args实现PHP伪重载


    今天在看书的时候,发现书上有这么一条:函数重载的替代方法——伪重载

    确实,在PHP中没有函数重载这个概念,让很多时候我们无法进行一些处理,甚至有时候不得不在函数后面定义好N个参数在看到了func_get_arg,func_get_args,func_num_args,这三个函数的时候,你们是不是想起了什么?

    So,let's try it...

    <?php
    function  testOne($a) {
    echo ('一个参数就这样 ');
    }
    
    function testTwo($a, $b) {
    	echo ('两个参数的就这样 ');
    }
    
    function testThree($a, $b, $c) {
    	echo ('呵呵,这是三个参数的 ');
    }
    
    function test() {
    	$argNum = func_num_args();
    
    	// 这一段其实可以用 $_arg = func_get_args() 来获得所有的参数,只是要用数组而已,不方便我下面的表达,呵呵
    	for ($i = 0; $i < $argNum; $i++) {
    		$_arg_{$i} = func_get_arg($i);
    	}
    
    	switch ($argNum) {
    		case 1 :
    			testOne($_arg_1);
    		break ;
    		case 2 :
    			testTwo($_arg_1, $_arg_2);
    		break ;
    		case 3 :
    			testThree($_arg_1, $_arg_2, $_arg_3);
    		break ;
    		default :
    			echo (' 这是没有参数的情况 ');
    		break ;
    	}
    }
    
    /**
     * 例子的实现
     */
    test();
    echo ('<br>');
    test(1);
    echo ('<br>');
    test(1, 2);
    echo ('<br>');
    test(1, 2, 3);
    
    // 这些只是在函数中的运用,其实最主要的还是在类中的运用
    // 如果这些用到类里面我就不需要担心构造函数是否有几个参数了,不是吗?
    // 类里面的运用只举一个简单的例子
    
    class test
    {
    	var $a = 0;
    	var $b = 0;
    
    	function test() {
    		$argNum = func_num_args();
    		$_arg = func_get_args();
    		switch ($argNum) {
    			case 1 :
    				$this->test1($_arg[0]);
    			break ;
    			case 2 :
    				$this->test2($_arg[0], $_arg[1]);
    			break;
    			default :
    				$this->a = 0;
    				$this->b = 1;
    			break;
    		}
    	}
    
    	function test1($a) {
    		$this->a = $a;
    	}
    
    	function test2($a, $b) {
    		$this->a = $a;
    		$this->b = $b ;
    	}
    }
    ?>

    延伸阅读:

    PHP函数call_user_func和call_user_func_array详解

  • 相关阅读:
    制作一个html中闪动的title 来提示消息
    Unicode与 utf8的互相转换
    程序员找女友的类
    使用php将数组转为XML
    自己动手画一个HTML5的按钮
    浏览器推通知给桌面
    如何使用定时任务
    封装之property,多态,鸭子类型,classmethod与staticmethod
    面向对象
    继承与派生
  • 原文地址:https://www.cnblogs.com/52php/p/5659988.html
Copyright © 2020-2023  润新知