2012-04-09 4 views
-3

Можно создать дубликат:
Is it really that wrong not using setters and getters?
Why use getters and setters?Для чего нужны геттеры/сеттеры?

Я всегда интересно, почему люди, использующие добытчиками/сеттеры в PHP вместо использования открытых свойств?

С другой вопрос, я скопировал этот код:

<?php 
class MyClass { 
    private $firstField; 
    private $secondField; 

    public function __get($property) { 
    if (property_exists($this, $property)) { 
     return $this->$property; 
    } 
    } 

    public function __set($property, $value) { 
    if (property_exists($this, $property)) { 
     $this->$property = $value; 
    } 

    return $this; 
    } 
} 
?> 

Я не вижу никакой разницы между этим и с помощью открытых полей.

Ну, я знаю, что это может помочь нам проверить данные в обоих геттер и сеттер, но в приведенном выше примере просто не подходит ему

+1

См. Http://stackoverflow.com/questions/1568091/why-use-getters-and-setters –

+0

@genesis +1. Я никогда не использую их. Для этого нужен __construct! – FredTheWebGuy

ответ

7

геттеры и сеттеры используются для того, чтобы предотвратить код outwith класса от доступа осуществление подробности. Возможно, сегодня часть данных - это всего лишь строка, но завтра она будет создана путем объединения двух других строк вместе, а также для подсчета количества раз, когда строка извлекается (ОК, надуманный пример).

Дело в том, что, заставляя доступ к вашему классу проходить через методы, вы можете свободно изменять, как ваш класс делает вещи, не влияя на другой код. Публичные свойства не дают вам этой гарантии.

С другой стороны, если все, что вы хотите сделать, это хранить данные, тогда общедоступные свойства прекрасны, но я думаю, что это особый случай.

+0

Ой, поэтому основная причина заключается в том, что вы можете начать проверку значения до установки без изменения его во всех случаях установки свойства? – genesis

+0

Да, это еще одна веская причина. Код подтверждения в одном месте - очень хорошая вещь. –

1

С помощью геттеров и сеттеров вы получаете контроль над свойствами класса. Посмотрите, как этот пример:

<?php 
class User 
{ 
    public function $name; 

    public function __construct($name) 
    { 
    $this->setName($name); 
    } 

    public function setName($name) 
    { 
    if (!preg_match('/^[A-Za-z0-9_\s]+$/')) { 
     throw new UnexpectedValueException(sprintf('The name %s is not valid, a name should only contain letters, numbers, spaces and _', $name); 
    } 
    $this->name = $name; 
    } 
} 
$foo = new User('Foo'); // valid 
$foo->name = 'Foo$%^&$#'; // ahh, not valid, but because of the public property why can do this 

Если вы свойство protected или private, это не может быть сделано, и вы можете иметь контроль над тем, что находится в собственности.

+0

Хм, это не соответствует моему примеру - у вас на самом деле есть новый сеттер для каждого свойства. Я не. Но я понимаю, что вы имеете в виду – genesis

+0

@genesis Да. Я никогда не использую магические сеттеры/геттеры. Причина, по которой магические методы полезны, заключается в том, что вы хотите сохранить элементы в одном свойстве в классе, например, в регистре или в контейнере сервисов. –

+0

Пример вышеупомянутого комментария: http://snipplr.com/view/64458/a-simple-registery/ –

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