PHPのメソッドオーバーロード?

最初にJavaでプログラミングすることを学び、次にPHPプログラマーの仕事が明らかになり、すぐにそれに移行しました。 ただし、ご存知のとおり、Javaは厳密に型指定された言語であり、PHPはそうではありません。ここから、いくつかのクラスを作成するときに問題が発生しました。
たとえば、PHPには明示的なメソッドのオーバーロードはありません。そのような状況から抜け出す方法を見つけることをお勧めします。

たとえば、オンラインストアなどの製品のクラスを考えます。
クラスProdcuts {
            パブリック$名;
	パブリック$価格。
	 public $ id;
	関数__construct($ id){
		 $ sql = "SELECT * FROM製品WHERE id = $ id";
		 $ result = mysql_query($ sql);
		 $ array = mysql_fetch_array($ result);
		 $ this-> name = $ array ['name']; 
		 $ this-> price = $ array ['price'];
		 $ this-> id = $ id; 
	 }

 }



この場合、次のように新しいオブジェクトを作成できます。
$ objProd =新しい製品(1)
クラスのコンストラクターで、id = 1に関連するすべてが選択され、オブジェクトが初期化されます。
しかし、ある時点で、他の方法でオブジェクトを初期化する必要があることに気付きました。
たとえば、そのようなメソッドの場合:
	静的関数create($名前、$価格){
		 $ sql = "Poducts(名前、価格)に値を挿入しますVALUES( '$名前'、 '$価格')";
		 if(mysql_query($ sql)){
			新しいProdcuts($名前、$価格)を返します。
		 }
	 }



ここで、コンストラクタのオーバーロードまたはオブジェクトを初期化するいくつかの代替方法の問題が生まれました。
いくつかの方法を知っており、それらをスワミと共有しています。 誰かがこの問題を解決するためのより多くのオプションを提供してくれたら嬉しいです。

メソッド番号1。 オプションのパラメーターを使用します。
次のようにコンストラクタを再実行します。

	関数__construct($ id = null、$ name = null、$ price = null){
		 if(isset($ name)&& isset($ price)){
			 $ this-> name = $ name;
			 $ this->価格= $価格;
		 } else {
			 $ sql = "SELECT * FROM製品WHERE id = $ id";
			 $ result = mysql_query($ sql);
			 $ array = mysql_fetch_array($ result);
			 $ this-> name = $ array ['name']; 
			 $ this-> price = $ array ['price'];
			 $ this-> id = $ id; 
		 }
	 }


つまり、idパラメータを指定できません
次のようになります。
$ product = new Prodcuts(null、$ name、$ price);
同意します、これはあまり美しくありません。

メソッド番号2。 func_num_args()およびfunc_get_arg()関数を使用します。


	関数__construct($ id){
		 if(func_num_args()> 1){
			 $ this-> name = func_get_arg(0);
			 $ this-> price = func_get_arg(1);
		 } else {
			 $ sql = "SELECT * FROM製品WHERE id = $ id";
			 $ result = mysql_query($ sql);
			 $ array = mysql_fetch_array($ result);
			 $ this-> name = $ array ['name']; 
			 $ this-> price = $ array ['price'];
			 $ this-> id = $ id; 
		 }
	 }
	


ここでは、2つの「マジック」関数を使用します。
func_num_args()-現在の関数の引数の数を返します。
func_get_arg()-現在の関数の指定された引数を返します(ゼロからカウント)。
指定されたパラメーターの数を確認し、必要に応じてオブジェクトを初期化します。

メソッド番号3。 コンストラクターの「オーバーロード」の静的関数拒否の初期化に使用します

 static public function createWithTwoParams($ name、$ price){ 
     $ object = new self();
     $ object-> initTwoParams($名前、$価格);
     $オブジェクトを返します。
 }
  
保護された関数initTwoParams($価格、$名前){
	 $ this-> name = $ name;
	 $ this->価格= $価格;
 }



この場合、結果は次のとおりです。
静的関数はオブジェクトを作成せずに実行でき、製品クラスのインスタンスを返します
$ product = Products :: createWithTwoParams($ name、$ price);
ただし、コンストラクタを使用することもできます。
$ product = new Prodcuts($ id);

PHPにオーバーロードなどはないが、厳密でない型付けを使用すると、「アダルト言語」が夢にも思わなかったことを実行でき、さらに、非常に便利で、何か不足している問題をすべて解決できるとします。

PS:私の最初の投稿、厳密に判断しないでください。

Source: https://habr.com/ru/post/J50094/


All Articles