2013-05-28 3 views
0

У меня есть объект 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 Да, но если вы отделите создание объектов от mannipulation, вы получите правильный код. Конечно, вы можете принудительно настроить Id даже на объект SimpleMyClass, но затем вы нарушите «контракт» метода. На самом деле этот метод отлично работает с сильно типизированными языками, в PHP вы можете преодолеть некоторые ограничения. – wachme

+0

Итак, может быть, я должен изменить архитектуру, потому что я использую идентификатор моего объекта для проверки, должен ли он быть вставлен или обновлен в базе данных, когда я вызываю метод persist(). Если у объекта есть идентификатор, это означает, что он поступает из базы данных, поэтому это просто обновление. Если он не имеет идентификатора, то это новый объект. Поэтому, если мы сможем легко изменить идентификатор, это может быть проблемой, если не обрабатывается ... – theplayer777

Смежные вопросы