Jump to content
alexsouzadobrasil

property_exists in traits

Recommended Posts

Bom dia,

eu tenho uma classe com varias propriedades (a,b,c) e uma trait vinculada a ela com outras propriedades (d,e,f,g). no código abaixo eu pego as propriedades da classe e da trait (a,b,c,d,e,f,g), mas eu

quero pegar apena da classe.

       
          if (property_exists($this, $key)) {
             ...
           }
 

()

Share this post


Link to post
Share on other sites

Não há como resolver essa situação com 100% de certeza (ao menos não na versão atual do PHP, talvez no futuro seja implementado algum método para isso).

 

O primeiro passo é entender como o PHP trata as traits. Resumidamente, é um recurso, do interpretador, de reutilização de código através de copy'n paste (copia e cola).

 

Basicamente, você criará um pequeno trecho de código:

Spoiler

trait MyTrait 
{
    private $firstName;
}

 

 

 

Que será reutilizado por um(a) classe/objeto:

Spoiler

class MyClass
{    
    use MyTrait;
    
    private $lastName;

    public function __construct($firstName , $lastName)
    {
        $this->firstName = $firstName;
        $this->lastName = $lastName;
    }
    
    public function __toString()
    {
        return sprintf("My name is: %s %s" , $this->firstName , $this->lastName);
    }
}

 

 
 

E executará o código:

Spoiler

$class = new MyClass("Gabriel" , "Heming");
echo $class;

 

 

 

No final das contas, a classe, MyClass é interpretada da seguinte forma:

 

Spoiler

class MyClass
{	
    private $name; //código da Trait copiado para a classe

    public function __construct($name)
    {
        $this->name = $name;
    }
	
    public function __toString()
    {
        return sprintf("My name is: %s" , $this->name);
    }
}

 

 

 

Além de tudo, apesar de ser tratada como uma herança (inheritance), a trait não é herdada e ela poderá ser usada mais de uma vez em uma hierarquia de classes.

 

Por isso, e alguns outros detalhes, a propriedade (e tudo mais que vier da trait) se torna intrinsica da classe e não apenas da trait.

 

Você até pode tentar chegar em algum resultado através de Reflection:

class MyClass
{
    /** demais códigos omitidos **/

    public function hasProperty($propertyName)
    {
        $reflectionObject = new ReflectionObject($this);
        
        if (!$property = $reflectionObject->getProperty($propertyName))
        {
            return false;
        }
        
        $declaringClass = $property->getDeclaringClass();
        
        $callback = function(ReflectionClass $trait) use ($propertyName) {
            try {
                $trait->getProperty($propertyName);

                return false;
            } 
            catch (\ReflectionException $exception)
            {
                return true;
            }
        };

        return count(array_filter($declaringClass->getTraits() , $callback)) > 0;
    }
}

Validando o que existe na class e na trait:

$class = new MyClass("Gabriel" , "Heming");

printf('A classe MyClass possui a propriedade firstName? %s' , $class->hasProperty('firstName') ? 'Sim' : 'Não');
printf('A classe MyClass possui a propriedade lastName? %s' , $class->hasProperty('lastName') ? 'Sim' : 'Não');

Mas existem algumas situações que não podem ser contornadas, como o caso de a propriedade existir na classe e na trait ao mesmo tempo, você não conseguirá distinguir.

  • +1 1

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By fernandoanael
      Olá pessoal, tudo bem? Tenho aprendido sobre herança e vi também sobre traits.
      Eu entendi tudo na teoria mas na hora de fazer alguns exemplos do livro pra praticar, sempre dá um erro informando que a classe a ser herdada ou a trait não foi encontrada. Eu não entendo o porque do erro já que a Classe mãe e a trait estão na mesma pasta. E isso ocorre mesmo quando tento rodar os exemplos do livro da Novatec que é o livro que estou usando pra aprender PHP.
      Se alguém puder me dar uma luz, agradeceria muito!!!
      Se tiver qualquer outro erro, mesmo que não influenciando no erro principal, podem ajudar, estou aprendendo, toda ajuda é ouro!
      Um exemplo simples que eu criei pra mostrar que simplesmente não consigo herdar nada, o erro acontece também quando tento usar traits.
      Arquivo: mae.php
      <?php
      class mae
      {
      public $palavra = "Fala Galera!!!";
      function imprimePalavra()
      {
      echo $palavra;
      }
      }
      ?>
      Arquivo: filha.php
      <?php
      class filha extends mae {
      function imprimePalavra()
      {
      parent::imprimePalavra();
      }
      }
      ?>
      Arquivo: teste.php
      <?php
      include 'filha.php';
      $teste = new filha();
      $teste->imprimePalavra();
      ?>
      ERRO: Fatal error: Class 'mae' not found in C:\Program Files (x86)\EasyPHP-Devserver-16.1\eds-www\Aprendendo\classes\filha.php on line 2.
      nota: Os 3 arquivos estão na mesma pasta.
    • By zeljunior
      Pessoal bom dia.
       
      Tenho um cenário com Debian Wheezy + PHP 5.4 + IDE Eclipse.
       
      Quando tendo declarar a syntax "trait" no eclipse ele não reconhece o comando, fica grifado como "syntax error, unexpected".
       
      Alguém já passou por isso?
       
      Obrigado.
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.