Разница между нормальными и магическими сеттерами и геттерами - PullRequest
1 голос
/ 05 апреля 2010

Я использую магический класс getter / setter для своих переменных сеанса, но я не вижу никакой разницы между обычными setter и getter.

код:

class session
{
    public function __set($name, $value)
    {
        $_SESSION[$name] = $value;
    }

    public function __unset($name)
    {
        unset($_SESSION[$name]);
    }

    public function __get($name)
    {
        if(isset($_SESSION[$name]))
        {
            return $_SESSION[$name];
        }
    }
}

Теперь первое, что я заметил, это то, что мне нужно вызвать $session->_unset('var_name'), чтобы удалить переменную, в этом нет ничего «волшебного».

Во-вторых, когда я пытаюсь использовать $session->some_var, это не работает. Я могу получить только переменную сеанса, используя $_SESSION['some_var'].

Я посмотрел руководство по PHP, но функции выглядят так же, как мои.

Я что-то не так делаю или в этих функциях нет ничего волшебного.

Ответы [ 4 ]

1 голос
/ 05 апреля 2010

Первый выпуск, когда вы звоните

unset($session->var_name);

Это должно быть так же, как звонить

$session->_unset('var_name');

Что касается невозможности использования __get (); Что не работает? Для чего задается переменная и какие предупреждения выдаются. Убедитесь, что вы установили error_reporting() на E_ALL.

Также неплохо проверить, что вы позвонили session_start

1 голос
/ 05 апреля 2010
class session { /* ...as posted in the question ... */ }

session_start();
$s = new session;
$s->foo = 123;
$s->bar = 456;
print_r($_SESSION);

unset($s->bar);
print_r($_SESSION);

печать

Array
(
    [foo] => 123
    [bar] => 456
)
Array
(
    [foo] => 123
)

Хорошо, может быть, не "магический". Но работает как задумано.
Если это не то, что вы хотите, пожалуйста, уточните ...

1 голос
/ 05 апреля 2010

Я думал, что получатели и установщики были для переменных внутри класса?

class SomeClass {
    private $someProperty;

    function __get($name) {
        if($name == 'someProperty') return $this->someProperty;
    }

    function __set($name, $value) {
        if($name == 'someProperty') $this->someProperty = $value;

    }
}


$someClass = new SomeClass();
$someClass->someProperty = 'value';
echo $someClass->someProperty;

0 голосов
/ 28 января 2014

Это мое понимание до сих пор о магической функции

Пожалуйста, поправьте меня, если я ошибаюсь ...

$ SESSION - это массив , а не объект поэтому вы можете получить к ним доступ, используя $ session ['field'], а не $ session-> field

магическая функция позволяет использовать имя функции __fnName перед любой функцией как

fnNameNewField ($ значение);

итак, он будет разделен на NewField в качестве ключа и будет отправлен __fnName, и на этом будет произведена операция

например: setNewId ($ value) будет отправлено __set () с ключом = new_id и параметрами ...

...