Bạn đã hinted PHP để mong đợi một thể hiện của FetchMode
(giống như nó nói trong thông báo lỗi), nhưng FetchMode::FETCH*
đi hằng giá trị. Bạn sẽ phải sử dụng một số loại Enum instance (mà chúng ta không có trong PHP. (Oh well, có SplEnum
nhưng ai sử dụng nó?)) Hoặc thay đổi chữ ký phương thức để loại trừ typehint.
Tuy nhiên, thay vì Switch/Case, bạn có thể solve this more easily via Polymorphism và Strategy pattern, ví dụ: thay vì làm một cái gì đó giống như
public function getRecordSet($mode)
{
switch ($mode) {
case FetchMode::ALL:
// code to do a fetchAll
break;
case FetchMode::ONE:
// code to do a fetchOne
break;
default:
}
}
đó sẽ làm tăng Cylcomatic Complexity của lớp và các lực lượng của bạn thay đổi lớp đó và FetchMode
bất cứ khi nào bạn cần phải thêm FetchModes bổ sung, bạn có thể làm:
public function getRecordSet(FetchMode $fetchModeStrategy)
{
return $fetchModeStrategy->fetch();
}
và sau đó đã một bê tông FetchMode
lớp interface để protect the variation
interface FetchMode
{
public function fetch();
}
và thêm es cho mỗi hỗ trợ FetchMode
class FetchOne implements FetchMode
{
public function fetch()
{
// code to fetchOne
}
}
class FetchAll …
class FetchRow …
Bằng cách này, bạn sẽ không bao giờ phải chạm vào lớp với phương thức getRecordSet
một lần nữa bởi vì nó sẽ làm việc cho bất kỳ lớp thực hiện mà FetchMode
inteface.Vì vậy, bất cứ khi nào bạn có FetchModes mới, bạn chỉ cần thêm một lớp mới, đó là nhiều hơn nữa duy trì trong thời gian dài.
FetchMode :: FetchOne giải quyết thành 1, vì vậy bạn thực sự chuyển 1 cho hàm, chứ không phải đối tượng của loại FetchMode. Tôi không biết bạn muốn đạt được điều gì, nhưng hãy nhớ rằng bạn phải truyền một đối tượng kiểu FetchMode đến hàm của bạn, vì vậy bạn cần một số loại '' $ fm = new FetchMode(); '' – Sgoettschkes