2013-10-08 35 views
0

我工作的一個面向對象的實現,我有以下幾點:怪異PHP實現默認值

abstract class Parent{ 
    public abstract function select($order="desc"); 

} 


class Child extends Parent{ 
    public function select($order) // here is the problem error 
    { 
     // selection code 
    } 

} 

該拋出告訴我,該聲明必須是與父方法兼容的錯誤。

我沒有實現它與正確的參數,除非我沒有進行默認參數設置。

我不想在100個類中複製父級方法的相同原型,如果我希望有一天改變默認值。我怎樣才能做到這一點?

是否存在於php中?

+0

我認爲你應該讓你的函數的實現頭部匹配抽象函數。 – NotMe

回答

3

public abstract function select($ order =「desc」); 和公共功能選擇($ order)不匹配。 從抽象函數中刪除默認值。

+0

我需要一個實現此方法的人之間的公社默認值你所說的沒有解決任何問題 – user1825286

+0

將它存儲在對象上。不要將它作爲參數傳遞。如果您必須將其作爲Arg來使用,請將其作爲可選參數。 在構造函數中初始化它。如果您需要它在較低級別的類中不同,請在該對象上覆蓋它。 –

0

所有你需要做的是改變你的擴展方法是這樣的:

public function select($order="some other value") // here is the problem error 
    { 
     // selection code 
    } 

主要是因爲原來的方法有一個默認值,則所有覆蓋必須有一個默認值。

爲了做你想做的事情,你必須做出$ order一個Parent的對象屬性,並改變方法簽名以擺脫$ order參數。然後在任何特定的實現中,您可以簡單地將$ order設置爲您想要的任何其他項。

+0

是的,但我想要一個公社之間的默認值,如果我想改變它會很容易 – user1825286

+0

你可以定義什麼是「公社」的默認值是?這就像嬉皮士的價值,試圖在路邊賣花嗎? /諷刺:無論哪種方式,這是它的工作原理。 – NotMe

+0

lol它意味着所有繼承自這個父類的類我已經知道默認值是xxx,但是如果每個類都必須具有父類的原型但不包含值 例如其他人可以使用yyyy實現,如默認值 – user1825286

1

關於我可以看到,以避免更新了很多價值,如果你想改變這種普遍默認的唯一方法是這樣的:

abstract class Parent{ 
    const DEFAULT_SELECT_ORDER = "desc"; 

    public abstract function select($order = ""); 

    protected static function select_order(&$order) 
    { 
     if (empty($order) || !in_array(strtolower($order), array("asc", "desc"))) { 
      // additional test to check if the value is valid 
      $order = self::DEFAULT_SELECT_ORDER; 
     } 
    }  
} 


class Child extends Parent{ 
    public function select($order = "") // here is the problem error 
    { 
     self::select_order($order); 

     // selection code 
    } 
} 

嗯 - 另一個,可能是更好的方法:

abstract class Parent { 
    protected $order = "desc"; 

    public function order($order) { 
     if (in_array(strtolower($order), array("asc", "desc"))) { 
      $this->order = $order; 
     } else { 
      // probably should throw an exception or return false or something 
     } 

     return true; 
    } 

    public abstract function select(); 
} 



class Child extends Parent { 
    public function select() { 
     // select code using $this->order 
    } 
} 



$query = new Child(); 
$query->order("asc"); 
$results = $query->select(); 
0

你可能可以用我的小庫ValueResolver,例如:

$myVar = ValueResolver::resolve($var, $default); 

一第二,不要忘記使用命名空間use LapaLabs\ValueResolver\Resolver\ValueResolver;

也有能力類型轉換,例如,如果你的變量的值應該是integer,所以用這個:

$id = ValueResolver::toInteger('6 apples', 1); // returns 6 
$id = ValueResolver::toInteger('There are no apples', 1); // returns 1 (used default value) 

檢查docs更多的例子