2010-04-05 2 views
1

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

Код:

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, но функции выглядят так же, как и мои.

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

ответ

1

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

unset($session->var_name); 

Она должна быть такой же, как вызов

$session->_unset('var_name'); 

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

Он также может быть хорошей идеей, чтобы проверить вас назвали session_start

+0

О да, теперь набор и прием работают. Я ссылался на неверные переменные для моего теста. +1 И спасибо за правильный синтаксис метода unset. Будет ли этот синтаксис: unset ($ session-> var_name); не работает, если нет волшебства? –

+0

@Saif Нет, это не так. Если вы хотите использовать 'unset', вы должны определить функцию' __unset'. – Yacoby

+0

По крайней мере, это не повлияет на _SESSION без этого метода __unset(). – VolkerK

1

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

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

Это вопрос не ответа. Во-вторых, магические функции таковы. Функции. Ограничения на то, что они могут получить, такие же, как и обычные функции, поэтому нет причин, по которым они не могут вернуть значение из внешнего источника. Например, Doctrine получает и устанавливает значения из данных. – Yacoby

+0

Нет, вам больше не нужно определять переменную внутри функции. Это одна из частей «магии», которую я понял. Когда вы просто вызываете $ someclass-> variable = 10; он будет делать эту переменную, если она не существует. –

1
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 
) 

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

+0

Да, это то, что я хочу. Я сделал некоторые глупые ошибки в своем коде, извините за это. Это работает просто отлично, только правильный синтаксис для unset не был ясен для меня. Однако он работает так. –

+0

+1 для приятного теста –

0

Это мое понимание до сих пор о волшебной функции

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

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

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

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

так, он будет разделен на Ньюфилд, как ключ и будет отправлен __fnName и oprations будет сделан на этом

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

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