2017-08-09 16 views
-1

どのように私はこのコードをPHPで書くことができますか?PHPでインスタンスを作成せずにクラスを作成していますか?

Database::select("podomoro")->table("blog")->get(); 

又は

Database::table("blog")->select("podomoro")->get(); 

第二の方法は、データベース・クラスの後、変更することができます。

+0

laravelソースを参照してください。 –

+0

あなたは実際にそれらのいずれかを書くべきではありません。これらの行にはそれぞれ複数のアンチパターンがあるためです。 –

+1

@u_mulder "learn from laravel"は、初心者のための破壊的で一般的なダムの提案です。 –

答えて

1

私はラインにこのコードを分割します:

Database::select("podomoro") 
    ->table("blog") 
    ->get(); 

最初の行は、基本的に、クラスのデータベースの静的メソッドを呼び出します。この静的メソッドは、オブジェクトインスタンス(おそらく種類のSELECTオブジェクト)を返します。このオブジェクトはメソッドtable()(おそらく他の多くのもの)を持っています。

第2行目では、table()オブジェクトのメソッドを1行目に戻して呼び出しています。このメソッドは何かを行い、別のオブジェクトインスタンスを返します。これはメソッド呼び出しチェーンを作ることができるときに、 "流暢な"インターフェースに使われます。

3行目は、2行目で呼び出された関数から返されたオブジェクトのメソッドget()を呼び出します。

本の最も簡単な実装は次のようになります。

<?php 

class Database 
{ 
    public static function select($something) 
    { 
     // Do something meaningfull 
     return new Query(); 
    } 
} 

class Query 
{ 
    public function table($name) 
    { 
     // Do something meaningfull 
     return $this; 
    } 

    public function get() 
    { 
     // Do something meaningfull 

     return $this; 
    } 
} 

しかし、コメントで述べた他の人のように、このパターンは、多くの場合、使い古さとある - 実際に - 多くの場合、アンチパターンとなります。現代のフレームワーク(Symfony2など)では、Dependency Injectionとサービスインスタンスを使うべきです。

流暢なインターフェイスもお勧めしません。例えば、builderパターンを実装するときには、ほとんどの場合それらを使用してください。 QueryBuilder Doctrineなど

わたしにとっては、あなたが何をしているのかわからないのであれば、私は静的なクラスメソッドの使用をお勧めしません。私は主にクラスのコンストラクタをオーバーロードするために使用しています(プライベートクラスコンストラクタと、クラスインスタンスを作成するために使用されるさまざまなパラメータを持ついくつかの静的メソッドを作成します)。最近では、DIをそのような機能を持たない古いフレームワークに統合するときに、DIオブジェクト自体がシングルトンであり、固定のgetInstance()メソッドを持っていたときに、このメソッドを使用しました。私はそれを非常に誇りに思いません。

+0

私は個人的にカスタム[データマッパー](https://martinfowler.com/eaaCatalog/dataMapper.html)を書くことをお勧めします。 –

0

私はこの質問に対する答えを見つけました。 @ tomasz-struczyńskiの方法も真です。

class PhoneNumber 
    { 
     protected $number; 
     protected $countries = []; 
     protected $country; 
     public function __construct($number) 
     { 
      $this->number = $number;     
     } 

     public static function make($number, $country = []) 
     { 
      $instance = new static($number); 
      return $instance->ofCountry($country); 
     } 

     public function ofCountry($country) 
     { 
      $countries = is_array($country) ? $country : func_get_args(); 
      $instance = clone $this; 
      $instance->countries = array_unique(array_merge($instance->countries, $countries)); 
      return $instance; 
     } 
    } 

    echo "<pre>"; 
    $dd=PhoneNumber::make(100,"TR")->ofCountry('BE'); 
    print_r($dd); 
関連する問題