簡體   English   中英

如何在重新定義的接口方法中訪問 class 的受保護屬性?

[英]How to access to the protected property of class in redefined interface method?

我有一個實現接口的 class 。

interface Animal {
    public static function giveHug();
}

class Dog() implements Animal {

    protected $race;

    public function __construct($race)
    {
        $this->race = $race;
    }

    public static function giveHug()
    {
        return 'Kiss my friend' . $this->race;
    }
}

我明白了

不能在非 object 上下文中使用 $this。

我明白這一點,那么如何在我重新定義的giveHug方法中獲得 Dog 屬性? 有人有什么技巧可以幫忙嗎? 謝謝

無論哪種方式,您都需要更改代碼。

如果::giveHug必須是 static,那么您需要能夠提供要擁抱的Animal

所以這有效:
但不是很好

interface Animal
{
    public static function giveHug(Animal $animal);
}

class Dog implements Animal
{

    protected $race;

    public function __construct($race)
    {
        $this->race = $race;
    }

    public static function giveHug(Animal $animal)
    {
        return 'Kiss my friend ' . $animal->race;
    }
}

$dog = new Dog('WauWau');
echo Dog::giveHug($dog) . PHP_EOL;
// Kiss my friend WauWau

這個更好:

interface Animal
{
    public static function getRace();

    public static function giveHug(Animal $animal);
}

class Dog implements Animal
{
    protected static $race;

    public function __construct($race)
    {
        self::$race = $race;
    }

    public static function getRace()
    {
        return self::$race;
    }

    public static function giveHug(Animal $animal)
    {
        return 'Kiss my friend ' . $animal::getRace();
    }
}

$dog = new Dog('WauWau');
echo Dog::giveHug($dog) . PHP_EOL;
// Kiss my friend WauWau

但是現在進入主題:這有意義嗎?

不。
這是一個非常好的例子。
您不要告訴“靜態”動物(或狗)擁抱。
你會想告訴一個特定的(物體)動物給一個擁抱。

所以這更有意義:

interface Animal
{
    public function giveHug();
}

class Dog implements Animal
{
    protected $race;

    public function __construct($race)
    {
        $this->race = $race;
    }

    public function giveHug()
    {
        return 'Kiss my friend ' . $this->race;
    }
}

$dog = new Dog('WauWau');
// Note: we call $dog to give hug. So the ONE dog =)
echo $dog->giveHug() . PHP_EOL;
// Kiss my friend WauWau

編輯:示例

$dog = new Dog('WauWau');
echo Dog::giveHug($dog) . PHP_EOL;

更像是“嘿,外面的所有狗......給這個(動物$狗)一個擁抱”。
在某些情況下,這是有道理的。 但在這種情況下 - 不是 =)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM