2017-12-09 10 views
0

Ich habe noch nie ein Merkmal gesehen, bei dem Eigenschaften und Methoden privat oder geschützt sind.Können Merkmale Eigenschaften und Methoden mit privater und geschützter Sichtbarkeit haben? Können Eigenschaften Konstruktor, Destruktor und Klassenkonstanten haben?

Jedes Mal, wenn ich mit Merkmalen arbeitete, beobachtete ich, dass alle Eigenschaften und Methoden, die zu einem Merkmal erklärt wurden, immer nur öffentlich sind.

Können Merkmale auch Eigenschaften und Methoden mit privater und geschützter Sichtbarkeit haben? Wenn ja, wie kann man auf sie innerhalb einer Klasse/innerhalb eines anderen Merkmals zugreifen? Wenn nein, warum?

Können Traits Konstruktor und Destruktor in ihnen definiert/deklariert sein? Wenn ja, wie kann man innerhalb einer Klasse auf sie zugreifen? Wenn nein, warum?

Können Traits Konstanten haben, ich meine wie Klassenkonstanten mit unterschiedlicher Sichtbarkeit? Wenn ja, wie in einer Klasse/in einer anderen Eigenschaft? Wenn nein, warum?

Besonderer Hinweis: Bitte beantworten Sie die Frage mit geeigneten Beispielen zur Demonstration dieser Konzepte.

Antwort

0

Eigenschaften können Eigenschaften und Methoden mit privater und geschützter Sichtbarkeit haben. Sie können auf sie zugreifen, als ob sie selbst zur Klasse gehören. Es gibt keinen Unterschied. Eigenschaften können Konstruktor und Destruktor haben, aber sie sind nicht für Merkmal selbst, sie sind für die Klasse, die Merkmal verwendet.

Traits können keine Konstanten haben, auch gibt es keine privaten oder geschützten Consts in 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(); 
Verwandte Themen