ホームページ  >  記事  >  バックエンド開発  >  PHPでオーバーロードを実装する方法の紹介

PHPでオーバーロードを実装する方法の紹介

黄舟
黄舟オリジナル
2017-10-19 09:16:401598ブラウズ

この記事では、主に PHP でオーバーロードを実装する一般的な方法を紹介します。PHP でのオーバーロードの 4 つの一般的な実装テクニックを、例の形式で Java と比較して分析します。 PHP でのオーバーロードの実装。一般的に使用されます。参考までに皆さんと共有してください。詳細は次のとおりです:

php は弱い型付け言語であり、JAVA のような強く型付けされた言語のようなオーバーロードがありません。

オーバーロードとは一般に、関数名またはメソッド名は同じだが、パラメータリスト(パラメータの数やパラメータの型を含む)が異なることを意味します

この定義から、PHPではオーバーロードが許可されていないため、PHPにはオーバーロードはありません同じ関数名存在します。

しかし、それがないからといって達成できないわけではありません。

php にはオーバーロードを実現するための 4 つのメカニズムがあります: (以下の Java との比較)

1. 弱い型、変数の型を定義する必要はありません まず、JAVA オーバーロードの例を示します:

class demo
{
  public static void main (String[] args)
  {
    sum(1,1);//2
    sum(1,1.5);//2.5
    sum(1.5,1.5);//3.0
  }
  public static void sum(int var1,int var2){
      System.out.println(var1+var2);
  }
  public static void sum(int var1,double var2){
      System.out.println(var1+var2);
  }
  public static void sum(double var1,double var2){
      System.out.println(var1+var2);
  }
}

上記のコードが php 言語で実装されている場合:

<?php
function sum($var1,$var2){
  echo $var1+$var2;
}
sum(1,1);//2
sum(1,1.5);//2.5
sum(1.5,1.5);//3
?>

2. 変数にデフォルト値を設定できるようにするオプションのパラメーター JAVA オーバーロードの例:

class demo
{
  public static void main (String[] args)
  {
    sum(1,2);//3
    sum(1,2,3);//6
  }
  public static void sum(int var1,int var2){
      System.out.println(var1+var2);
  }
  public static void sum(int var1,int var2,int var3){
      System.out.println(var1+var2+var3);
  }
}

php のオプションのパラメーターを使用します機能の実装:

<?php
function sum($var1,$var2,$var3=NULL){//$var3设置默认值
  echo $var1+$var2+$var3;
}
sum(1,2);//2
sum(1,2,3);//2.5
?>

同じ関数が見られますが、php のような弱い型指定言語の方が実装が簡単です

3. 変数パラメータ は主に次の 2 つの関数を使用します:

func_num_args() 関数のパラメータの数を返します

func_get_args() 関数パラメータのリストを含む配列を返します

func_num_args() 返回函数的参数个数
func_get_args() 返回一个包含函数参数列表的数组

具体实现方式:


<?php
class demo{
  public function method(){
    $numargs = func_num_args();//获得参数数量
    $args = func_get_args();//获得参数数组
    switch ($numargs) {//通过变量个数来确定调用哪个方法
      case 2:
        $this->method2($args[0],$args[1]);
        break;
      case 3:
        $this->method3($args[0],$args[1],$args[2]);
        break;
    }
  }
  private function method2($var1,$var2){
    #code...
  }
  private function method3($var1,$var2,$var3){
    #code...
  }
}
//调用
$obj = new demo();
$obj->method(&#39;var1&#39;,&#39;var2&#39;);
$obj->method(&#39;var1&#39;,&#39;var2&#39;,&#39;var3&#39;);
//看起来似乎通过一个接口调用
//但其实内部已经调用了各自定义的方法
?>

4. 使用魔术方法 __call()

public mixed __call ( string $name , array $arguments )

在对象中调用一个不可访问的方法时,__call()具体的な実装方法:

<?php
class demo{
  public function __call($name,$arguments){
    if($name == "method"){
      switch (count($arguments)) {//获得参数数组个数
        case 2:
          $this->method2($args[0],$args[1]);
          break;
        case 3:
          $this->method3($args[0],$args[1],$args[2]);
          break;
      }
    }
  }
  private function method2($var1,$var2){
    #code...
  }
  private function method3($var1,$var2,$var3){
    #code...
  }
}
//调用
$obj = new demo();
$obj->method("var1","var2");
$obj->method("var1","var2","var3");
?>

4。マジックメソッド __call() を使用します


public mixed __call ( string $name , array $arguments )

🎜 オブジェクト内のアクセスできないメソッドを呼び出す場合は、 __call() 自動的に呼び出されます🎜🎜🎜$name🎜パラメータは呼び出されるメソッドの名前です🎜$argument🎜パラメータは呼び出されるメソッドのパラメータ配列です🎜🎜具体的な実装方法は上記の3番目の点と同様です: 🎜🎜🎜🎜りー

以上がPHPでオーバーロードを実装する方法の紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。