Я никогда не видел ни одной черты, где свойства и методы являются частными или защищенными.
Каждый раз, когда я работал с признаками, я замечал, что все свойства и методы, объявленные для любой характеристики, всегда являются только публичными.
Могут ли признаки иметь свойства и методы с частной и защищенной видимостью? Если да, как получить к ним доступ внутри класса / внутри какой-то другой черты? Если нет, почему?
Могут ли черты иметь конструктор и деструктор, определенные / объявленные в них? Если да, как получить к ним доступ внутри класса? Если нет, почему?
Могут ли признаки иметь константы, я имею в виду константы классов с разной видимостью? Если да, то как внутри класса / внутри какой-то другой черты? Если нет, почему?
Специальное примечание: Пожалуйста, ответьте на вопрос с помощью подходящих примеров, демонстрирующих эти концепции.
Черты могут иметь свойства и методы с частной и защищенной видимостью. Вы можете получить к ним доступ, как будто они принадлежат самому классу. Нет никакой разницы.
У черт могут быть конструктор и деструктор, но они не для самой черты, а для класса, который использует черту.
Черты не могут иметь постоянных. До версии 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();
Других решений пока нет …