2017-08-09 275 views
-1

我該如何在php中編寫這段代碼?在不創建實例的情況下創建一個類?

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

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

第二方法可能會改變,數據庫類後。

+0

打開laravel資源並查看。 –

+0

你其實不應該寫這些。因爲每條線都有多個反模式。 –

+1

@u_mulder「從laravel學習」對於新手和一般的愚蠢建議都具有破壞性。 –

回答

1

我會拆分此代碼到行:

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

第一行基本要求的一類數據庫的靜態方法。這個靜態方法返回一個對象實例(可能 - 種類的SELECT對象)。該對象有方法table()(可能在其他許多方面)。

在第二行上,您將調用第一行返回的對象的方法table()。此方法執行某些操作並返回另一個對象實例。當您可以創建方法調用鏈時,這用於「流暢」接口。

第三行調用方法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等),您應該使用依賴注入和服務實例。

流利的接口也不鼓勵。您應該主要在實施builder模式時使用它們 - 例如。 QueryBuilder在學說等

至於我,我不建議使用靜態類方法,如果你不知道,你在做什麼。我使用它們主要是爲了重載類構造函數(我創建了私有類構造函數和幾個靜態方法,並使用不同的參數來創建類實例)。最近我已經使用它,將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); 
相關問題