web-dev-qa-db-fra.com

Les traits peuvent-ils avoir des propriétés et des méthodes avec une visibilité privée et protégée? Les traits peuvent-ils avoir des constantes constructeur, destructeur et classe?

Je n'ai jamais vu un seul trait où les propriétés et les méthodes sont privées ou protégées.

Chaque fois que je travaillais avec des traits, j'ai observé que toutes les propriétés et méthodes déclarées dans n'importe quel trait sont toujours publiques uniquement.

Les traits peuvent-ils aussi avoir des propriétés et des méthodes avec une visibilité privée et protégée? Si oui, comment y accéder à l'intérieur d'une classe/à l'intérieur d'un autre trait? Si non, pourquoi?

Les traits peuvent-ils avoir un constructeur et un destructeur définis/déclarés en leur sein? Si oui, comment y accéder dans une classe? Si non, pourquoi?

Les traits peuvent-ils avoir des constantes, je veux dire comme des constantes de classe avec une visibilité différente? Si oui, comment à l'intérieur d'une classe/à l'intérieur d'un autre trait? Si non, pourquoi?

Note spéciale: veuillez répondre à la question avec des exemples appropriés de travail démontrant ces concepts.

10
user9059272

Les traits peuvent également avoir des propriétés et des méthodes avec une visibilité privée et protégée. Vous pouvez y accéder comme s'ils appartenaient à la classe elle-même. Il n'y a pas de différence.

Les traits peuvent avoir un constructeur et un destructeur mais ils ne sont pas pour le trait lui-même, ils sont pour la classe qui utilise le trait.

Les traits ne peuvent pas avoir de constantes. Il n'y a pas de constantes privées ou protégées dans PHP avant la version 7.1.0.

trait Singleton{
    //private const CONST1 = 'const1'; //FatalError
    private static $instance = null;
    private $prop = 5;

    private function __construct()
    {
        echo "my private construct<br/>";
    }

    public static function getInstance()
    {
        if(self::$instance === null)
            self::$instance = new static();
        return self::$instance;
    }

    public function setProp($value)
    {
        $this->prop = $value;
    }

    public function getProp()
    {
        return $this->prop;
    }
}

class A
{
    use Singleton;

    private $classProp = 5;

    public function randProp()
    {
        $this->prop = Rand(0,100);
    }

    public function writeProp()
    {
        echo $this->prop . "<br/>";
    }
}

//$a1 = new A(); //Fatal Error too private constructor
$a1 = A::getInstance();
$a1->writeProp();
echo $a1->getProp() . "<br/>";
$a1->setProp(10);
$a1->writeProp();
$a1->randProp();
$a1->writeProp();
$a2 = A::getInstance();
$a2->writeProp();
$a2->randProp();
$a2->writeProp();
$a1->writeProp();
16
Hakan SONMEZ