Diferença entre setters e getters normais e mágicos
-
24-09-2019 - |
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.
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...