2014-07-18 59 views
0

所以我們可以說我有類調用父和子,這將從一個名爲PHP文件caller.php如何防止在PHP中的子實例中使用公共父方法?

class Child extends Parent { 

} 

class Parent { 

    public function parentMethod(){ 

    } 
} 

caller.php

防止被繼續使用:

$child = new Child(); 
$child->parentMethod(); 

允許的:

$parent = new Parent(); 
$parent->parentMethod(); 

我想防止調用parentMet像這樣。但是,如果我創建了父對象,我希望能夠調用parentMethod。有什麼方法可以用來隱藏這個方法在Child類中被公開,但是仍然允許父對象公開地調用這個方法?

唯一能做的我已經想出到目前爲止是使這些方法保護,然後創建一個其他類,將延長父母,然後有它需要每個功能的公共方法,但聽起來並不很聰明。

+0

沒辦法正確的方式。理智的方式。根據定義,您使用「public」,因此您將這些方法定義爲在任何地方都可見。如果你想隱藏子類的父方法,使用'private' - 但是這樣的方法不會在任何地方看到,而是那個類本身。 –

+0

所以我應該讓他們受到保護,並創建另一個類來調用所需的受保護方法? – Firze

+0

'保護'是不夠的。這意味着無處不在,包括兒童班。爲了隱藏孩子的方法,使用'私人' –

回答

1

其實你應該問自己:爲什麼你需要這樣的限制嗎?您已將方法定義爲public--因此,您告訴PHP它應該在任何地方都可見。所以爲了防止孩子打電話,你應該使用private可視性定義。

還有就是要檢查是否調用從父類製成,像一個辦法:

class ChildClass extends ParentClass {} 

class ParentClass 
{ 

    public function parentMethod() 
    { 
     if(get_class($this) != __CLASS__) 
     { 
      throw new LogicException("Somehow due to business logic you're not allowed to call this from childs"); 
     } 
    } 
} 

但我不建議這樣做。原因是:

  • 可讀性。你的方法只是普通的公共方法。望着它,無論你是否應該使用它與孩子的電話或不。因此,要維護這樣的代碼,您需要檢查代碼中的限制。現在想象一下你有50個這樣的方法。像這樣的十幾個班級。
  • 可能,打破Law of Demeter。爲什麼父母班在使用這種限制時應該意識到孩子?
  • 最後,這只是意想不到的行爲。展望定義,任何人都會看到你在之間延伸一個班級。因此,根據定義,所有具有正確可見性的繼承方法必須繼承。而你的邏輯改變了這一點。

你可能會想到composition,而不是繼承。這可能是實現你的邏輯(但是,我不能告訴是肯定的,因爲我不知道整個背景)

相關問題