Pergunta

Eu tive uma boa leitura do Especificações PHP sobre sobrecarga, e a maioria dos exemplos parece ter como objetivo simplesmente permitir a definição de campos personalizados (semelhante a stdClass).

Mas e os campos privados definidos na minha classe?Como eles devem ser recuperados/atribuídos?Eu poderia ativar valores possíveis e agir de acordo com determinados valores:

class A
{
    private $name;
    private $age;

    public function __get( $var )
    {
        switch ( $var )
        {
            case 'name':
                return $this->name;
                break;
            case 'age':
                return $this->age+10; // just to do something different ;)
                break;
            default:
                break;
        }
    }
}

Este é o melhor método ou existe outra prática recomendada geralmente aceita?(Não sei se é possível fazer um loop de variáveis ​​de classe dentro de uma classe, mas independentemente disso, isso não é apropriado na maioria das situações, pois você não deseja retornar tudo.)

Foi útil?

Solução

Isso efetivamente os tornaria públicos e, geralmente, você não ganha nada com o simples uso de propriedades públicas (mas você paga uma penalidade de desempenho e precisa escrever mais código, correndo o risco de bugs).

Use isso apenas se você tiver código existente que usa propriedade pública e de repente precisar de getter/setter para isso (como seu exemplo com age).

Se você precisar executar algum código quando a propriedade for lida/escrita (por exemplo,torná-lo somente leitura ou buscar preguiçosamente no banco de dados), então você deve usar getters/setters normais (getAge()/setAge()).

Outras dicas

Faço uso extensivo de __get() e __set() E tenho minhas propriedades declaradas public.Eu queria o melhor dos dois mundos, para que meu IDE pudesse listar propriedades públicas para mim quando eu digitasse o nome de uma instância de classe.Como consegui que os métodos interceptadores do PHP funcionassem, mesmo que as propriedades sejam públicas e visíveis fora da classe?

unset() as propriedades Eu quero __get() e __set() para ser usado na aula __construct().

Descobrir esse método levou algumas noites de frustração :-)

Não vejo muitas pessoas usando-os, mas aqui está o que penso.

Para recuperar variáveis ​​privadas, você provavelmente deseja fornecer uma lista de variáveis ​​definidas que podem ser acessadas externamente.Em seguida, verifique se a variável solicitada está nesse array.Se for, permita que seja alterado/obtido.Caso contrário, erro ou retornará nulo.

Honestamente, as implementações para isso são realmente caso a caso.Se você tivesse uma classe de usuário que armazenasse todas as informações em um único array, você poderia fazer com que $user->name fosse extraído de $user->account['name'], ou algo parecido.

Além disso, caso a caso, você pode fazer algumas modificações antes de fornecer valores, como hash de uma senha.

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