Pergunta

Estou usando uma classe getter/setter mágica para minhas variáveis ​​de sessão, mas não vejo nenhuma diferença entre setters e getters normais.

O código:

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];
        }
    }
}

Agora, a primeira coisa que notei é que preciso ligar $session->_unset('var_name') para remover a variável, nada de 'mágico' nisso.

Em segundo lugar, quando tento usar $session->some_var isso não funciona.Só consigo obter a variável de sessão usando $_SESSION['some_var'].

Eu olhei o manual do PHP, mas as funções são iguais às minhas.

Estou fazendo algo errado ou não há realmente nada de mágico nessas funções.

Foi útil?

Solução

Primeira questão, quando você liga

unset($session->var_name);

Deve ser o mesmo que ligar

$session->_unset('var_name');

Quanto a não poder usar __get();O que não funciona?Como a variável é definida e quais avisos são dados.Certifique-se de ter definido error_reporting() para E_ALL.

Também pode ser uma boa ideia verificar se você ligou session_start

Outras dicas

Achei que getters e setters fossem para variáveis ​​​​dentro da classe.

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;

?

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

estampas

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

Ok, talvez não seja "mágico".Mas funciona como pretendido.
Se não é isso que você deseja, por favor, explique ...

Este é o meu entendimento até agora sobre a função mágica

Por favor corrija-me se eu estiver errado...

$SESSION é uma matriz E não um objeto, portanto, você pode acessá-los usando $ session ['campo'] e não $ session-> campo

Função mágica permite que você use o nome da função __fnName antes de qualquer função como

fnNomeNovoCampo($valor);

então, ele será separado em NewField como chave e será enviado para __fnName e as operações serão feitas neste

por exemplo:setNewId($value) será enviado para __set() com key= new_id e Parâmetros...

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top