web-dev-qa-db-ja.com

トレイトはプライベートで保護された可視性を持つプロパティとメソッドを持つことができますか?トレイトはコンストラクタ、デストラクタ、およびクラス定数を持つことができますか?

プロパティとメソッドがプライベートまたは保護されている単一の特性を見たことがありません。

トレイトを操作するたびに、トレイトに宣言されたすべてのプロパティとメソッドは常にパブリックのみであることに気付きました。

トレイトにプライベートおよび保護された可視性を持つプロパティとメソッドを含めることもできますか?はいの場合、クラス内/他のいくつかの特性内でそれらにアクセスする方法?いいえの場合、なぜですか?

トレイトにはコンストラクタとデストラクタを定義/宣言できますか?イエスの場合、クラス内でそれらにアクセスする方法?ノーの場合、理由?

トレイトに定数を含めることができます。つまり、異なる可視性を持つクラス定数のようなものですか?はいの場合、クラス内/他のいくつかの特性の内側にどのように入るのですか?いいえの場合、なぜですか?

特記事項:これらの概念を示す適切な例を使用して質問に答えてください。

10
user9059272

トレイトは、プライベートおよび保護された可視性を持つプロパティとメソッドを持つことができます。クラス自体に属しているようにアクセスできます。違いはありません。

トレイトはコンストラクタとデストラクタを持つことができますが、トレイト自体ではなく、トレイトを使用するクラス用です。

特性は定数を持つことができません。バージョン7.1.0より前のPHPには、プライベートまたは保護された定数はありません。

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