php точка для магии __get () и __set () - PullRequest
3 голосов
/ 23 октября 2009

PHP 5 представляет магический метод __get () и __set (). Насколько я понимаю, это ярлык для того, чтобы написать метод получения и установки каждого члена;

 <?php
class Person {
    private $firstname;
    private $lastname;

    function __set($var, $name) {
        $this->$var = $name;
    }

    function __get($var) {
        return $this->$var;
    }
}

$person = new Person();
$person->firstname = "Tom";
$person->lastname = "Brady";


echo $person->firstname . " " . $person->lastname;

// print: Tom Brady
?>

У меня такой вопрос, это все равно, что сделать переменные-члены открытыми.

class Person {
    public $firstname;
    public $lastname;
}

Разве это не противоречит принципам ООП? И какой в ​​этом смысл?

Ответы [ 3 ]

3 голосов
/ 23 октября 2009

В вашем примере это было бы то же самое, что сделать их публичными. Однако ваши функции __set & __get не должны обрабатывать все переменные. (возможно, используя оператор switch, чтобы решить, что вы хотите обработать.) Кроме того, вы можете выполнить проверку данных параметров __set или вычислить возвращаемое значение для __get, которого вообще не существует.

Только что заметил, что вы используете $ this-> var вместо $ this -> $ var в вашем коде (я думаю, вы хотели, чтобы ваш код работал правильно)

2 голосов
/ 23 октября 2009

Следует понимать, что «принципы ООП» не отправляются в камень. Они больше похожи на эмпирические правила.

Так, например, в python все переменные-члены являются открытыми. Там нет реальных частных переменных.

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

Так что магические геттеры и сеттеры в php могут быть полезны при многих обстоятельствах. Например:

  • ORMappers
  • Когда вы создаете объект для отправки во внешний API
  • Когда вы хотите идентифицировать, кто-то получил доступ к переменной.
  • и т.д.

Теперь, если вы хотите сохранить приватные переменные и по-прежнему использовать магические методы получения и установки еще раз для конкретного случая вашего приложения вы можете изменить свой код использовать соглашение о подчеркивании '_' для частных переменных.

<?php
class Person {
    private $_firstname;
    private $_lastname;

    function __set($name, $value) {
        if (!strpos('_', $name) === 0) {
            $this->$name = $value;
        } else {
            throw new Exception ("trying to assign a private variable");
        }
    }

    function __get($name) {
        if (!strpos('_', $name) === 0) {
            retrun $this->$name;
        } else {
            throw new Exception ("trying to read a private variable");
        }
    }
}

?>
0 голосов
/ 23 октября 2009

Прежде всего, ваш пример не должен работать, потому что вы получаете доступ к $this->var.

Второе: Да, добавление магических сеттеров и геттеров похоже на добавление сеттеров и геттеров. Просто магия.

Существуют варианты использования __set и __get: если вы собирали библиотеку, такую ​​как ORM, это может пригодиться. Кроме того, его можно использовать в качестве свойств бедного человека: если вы изначально сделали поле открытым, теперь вы можете добавить поведение в __set и __get, как если бы оно всегда было (проверка, например).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...