特征可以具有具有私有和受保护可见性的属性和方法吗?特质可以有构造函数、析构函数和类常量吗?

Posted

技术标签:

【中文标题】特征可以具有具有私有和受保护可见性的属性和方法吗?特质可以有构造函数、析构函数和类常量吗?【英文标题】:Can traits have properties & methods with private & protected visibility? Can traits have constructor, destructor & class-constants? 【发布时间】:2018-05-23 10:42:03 【问题描述】:

我从未见过属性和方法是私有或受保护的单一特征。

每次我使用 trait 时,我发现所有声明到任何 trait 中的属性和方法总是只公开的。

特征是否也可以具有私有和受保护可见性的属性和方法?如果是,如何在类/其他特征中访问它们?如果不是,为什么?

特质可以在其中定义/声明构造函数和析构函数吗?如果是,如何在类中访问它们?如果不是,为什么?

特质可以有常量吗,我的意思是像具有不同可见性的类常量?如果是,如何在一个类/其他一些特征中?如果不是,为什么?

特别提示:请用合适的例子来说明这些概念。

【问题讨论】:

【参考方案1】:

特征也可以具有私有和受保护可见性的属性和方法。您可以访问它们,就像它们属于类本身一样。没有区别。

Traits 可以有构造函数和析构函数,但它们不是用于 trait 本身,而是用于使用 trait 的类。

特征不能有常数。 php 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();

【讨论】:

特征可以有常量,但你不能在类或其后代中重新定义它们。 不,特征不能有常量,见this

以上是关于特征可以具有具有私有和受保护可见性的属性和方法吗?特质可以有构造函数、析构函数和类常量吗?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Java 反射 API 允许我们访问私有和受保护的字段和方法?这不会破坏访问修饰符的目的吗? [复制]

json_encode类时丢失私有属性和受保护属性处理方法

如何禁止公共继承但允许私有(和受保护)继承

具有受保护可见性的变量的风险是啥

C ++ - 定义 - 私有继承[重复]

类图怎么看