我該如何在php中編寫這段代碼?在不創建實例的情況下創建一個類?
Database::select("podomoro")->table("blog")->get();
或
Database::table("blog")->select("podomoro")->get();
第二方法可能會改變,數據庫類後。
我該如何在php中編寫這段代碼?在不創建實例的情況下創建一個類?
Database::select("podomoro")->table("blog")->get();
或
Database::table("blog")->select("podomoro")->get();
第二方法可能會改變,數據庫類後。
我會拆分此代碼到行:
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()
。不過,我並不爲此感到自豪。
我個人建議改爲編寫自定義[數據映射器](https://martinfowler.com/eaaCatalog/dataMapper.html)。 –
我已經找到了這個問題的答案。 @ 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);
打開laravel資源並查看。 –
你其實不應該寫這些。因爲每條線都有多個反模式。 –
@u_mulder「從laravel學習」對於新手和一般的愚蠢建議都具有破壞性。 –