我創建在我的項目,在這個類得到一個報告類型爲字符串工廠類中工作。該字符串具有實現報表界面的具體類的名稱。對象創建不命名
我遇到的問題是,當我實例化這個類,我得到了Class not found
錯誤。
這裏遵循的工廠代碼。
namespace App\Term\Reports;
class Factory
{
public static function build($type)
{
$obj = new CableBySensor(); // Works!
// $type == 'CableBySensor'
$obj2 = new $type; // Class not found :(
// ... validates if the class exists ...
// ... and if it implements the Report Interface ...
// ... throw exception if class doesn't exist or doesn't implements interface
// ... then returns the corresponding object.
}
}
兩種方法實際上是相同的。
第一條:爲什麼我必須在字符串中指定類的全限定名以使其工作?類CableBySensor
與Factory
駐留在相同的名稱空間中。
這開始給我找麻煩,因爲我也想驗證被實例化的類實現ReportsInterface
。
二:我如何克服呢?我是否應該像這樣打電話給工廠$myReport = Factory::build('App\Term\Reports\' . $className);
或者我應該使用工廠類中的__NAMESPACE__
常量,例如:$obj = new __NAMESPACE__ . '\' . $className
?
謝謝。
讓我們退後一步,在這裏,你怎麼會在傳遞'$ type'作爲一個字符串?此外,你會認爲有'switch($ type){case「CableBySensor」:$ obj2 = new CableBySensort();打破;}'。 – Halcyon
您是否試圖通過使用__NAMESPACE__看看它是否有效? –
我建議您在線閱讀有關參數化工廠模式。我個人不會寫一個工廠類,然後像你一樣使用它。 – tomazahlin