2013-05-28 92 views
0

我有一個不應該被改變的id的PHP對象,除了在一個特定的上下文中,當一個特定的方法被調用時。但是這種方法在對象類之外,不能繼承。我不知道有什麼更好的方法可以正確執行此操作,如何通過正確的方法調用對象設置程序來「檢查」,以避免濫用?限制對象修改

在此先感謝您的幫助

編輯:這裏有一個例子:

<?php 

class myClass { 

private $id; 
private $var1; 
private $var2; 


private function setId($id){ 
    //this must be accessible only when calling "secureSetId()" from class "secureClass" 
    $this->id = $id; 

} 


public function setVar1{ 
    //this is a public function... 

} 

... 

} 

class secureClass { 


private function secureSetId($id){ 

    //this is accessible only here, but how to call private function "setId" from class "myClass"? 

} 

... 

} 

?> 
+0

debug_backtrace()是一個解決方案,但我不知道這是否是一個很好的,因爲它的成本一些性能... – bwoebi

+1

顯示一些代碼和示例 – nickb

回答

0
<?php 

interface SimpleMyClass { 
    public function setVar1($value); 
    public function setVar2($value); 
} 

interface SecureMyClass extends SimpleMyClass { 
    public function setId($id); 
} 

class MyClass implements SecureMyClass { 
    private $id; 
    private $var1; 
    private $var2; 

    public function setVar1($value) { /* ... */ } 
    public function setVar2($value) { /* ... */ } 
    public function setId($id) { /* setting id */ } 
} 

// classes that use "different versions" of MyClass 

class SecureOtherClass { 
    public function setMyClass(SecureMyClass $my) { /* this class is able to set id of MyClass */ } 
} 

class SimpleOtherClass { 
    public function setMyClass(SimpleMyClass $my) { /* this class uses simple version of MyClass */ } 
} 

?> 
+0

我不相信,但我不知道,如果我做這樣的事情:$ myClass MyClass = new MyClass(),然後$ myClass-> setId(7 ),我可以在任何地方做到......不是嗎?因爲setId()是公開的 – theplayer777

+0

@ theplayer777是的,但是如果你將對象創建與操作分開,你將得到正確的代碼。當然,你甚至可以在SimpleMyClass對象上強制設置Id,但是你會打破方法的「契約」。實際上,這種方法對於強類型語言來說很好,在PHP中你可以克服一些限制。 – wachme

+0

好吧,也許我應該改變體系結構,因爲我使用我的對象的id來測試當我調用方法persist()時它是否必須在數據庫中插入或更新。如果對象有一個id,這意味着他來自數據庫,所以它只是一個更新。如果它沒有ID,那麼它是一個新的對象。所以如果我們可以很容易地改變id,這可能是一個問題,如果不處理... – theplayer777