PHPはどのように関数の重荷を実現します

10153 ワード

よく知られているように、PHPはばらばらな言語なので、関数のリロードはサポートされていません(関数のオーバーライドとは異なります).しかし、今日Exceptionを見たとき、Exceptionのコンストラクタにリロードがあることに気づきました.以下のように呼び出すことができます.
  • throw new Exception("Something bad just happened", 4);
  • throw new Exception("Something bad just happened");
  • throw new Exception("",4);

  • 明らかに、上記の方法は重荷です.PHPでは関数のリロードが可能なのですが、どのように実現されているのでしょうか.しばらく考えてみると、PHPの弱いタイプである以上、関数パラメータのタイプによって関数を識別することはできないが、関数パラメータの個数を統計することができるだろう.そこで、この考え方に基づいて、以下のコードがあります.
     
    ClassTest.phpファイルコード
    
       
       
       
       
    1 <? php 2 class ClassTest{ 3 4 public function fun( $x = null , $y = null ){ 5 if ( func_num_args () == 1 ){ 6 $this -> fun1( $x ); 7 } 8 if ( func_num_args () == 2 ){ 9 $this -> fun2( $x , $y ); 10 } 11 } 12 13 private function fun1( $x ){ 14 echo " fun1 is called!\t\$x= $x <br/> " ; 15 } 16 17 private function fun2( $x , $y ){ 18 echo " fun2 is called!\t\$x= $x \t\$y= $y <br/> " ; 19 } 20 21 public function funWithoutParam(){ 22 $temp = " funWithoutParam " . func_num_args (); 23 $this -> $temp (); 24 } 25 26 private function funWithoutParam1(){ 27 echo " funWithoutParam1 is called!<br/> " ; 28 } 29 private function funWithoutParam2(){ 30 echo " funWithoutParam2 is called!<br/> " ; 31 } 32 } 33 ?>

    index.phpファイルコード
    
       
       
       
       
    1 <? php 2 function __autoload( $className ){ 3 require_once $className . ' .php ' ; 4 } 5 6 $test = new ClassTest(); 7 // overload with parameters 8 $test -> fun( 1 ); 9 $test -> fun( 1 , 2 ); 10 11 // overload without parameters 12 $test -> funWithoutParam( 1 ); 13 $test -> funWithoutParam( 1 , 2 ); 14 ?>

    上記のコードから、主にfunc_のおかげであることがわかります.num_args()関数の使用.