【问题标题】:How to access to the protected property of class in redefined interface method? [duplicate]如何在重新定义的接口方法中访问类的受保护属性? [复制]
【发布时间】:2021-12-30 13:56:30
【问题描述】:

我有一个实现接口的类。

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;
    }
}

我明白了

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

我明白这一点,那么如何在我重新定义的 giveHug 方法中获得 Dog 属性? 有人有什么技巧可以帮忙吗? 谢谢

【问题讨论】:

  • 静态方法只能调用静态方法/属性。因此;去除静电。
  • 我有几个类使用这个接口。你有什么技巧可以得到这个属性吗?
  • 如果您要创建一些 Dogs,静态函数将如何理解您要使用哪个种族?
  • 这是 static 环境在 OOP 中工作时的限制。您应该从您的方法中删除静态,但如果您必须以这种方式使用它,那么就这样做(它只会显示最后一个 Dog 实例的“吻我的朋友”):public function __construct($race) { $this->race = $race; self::$instance = $this; }public static function giveHug() { return 'Kiss my friend ' . self::$instance->race; }跨度>
  • class Dog() -- 这看起来不像是有效的 PHP。如果您先提取minimal reproducible example,这将有所帮助,同时确保您知道问题的真正含义。正如其他人所提到的,删除static 或描述您认为需要它的原因。另外,我建议您不要使用protected 成员,而是使用private,除非您有充分的(!)理由。

标签: php oop interface implements


【解决方案1】:

无论哪种方式,您都需要更改代码。

如果 ::giveHug 必须是静态的,那么您需要能够提供要拥抱的 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;

更像是“嘿,外面的所有狗……给这个(动物 $dog)一个拥抱”。
在某些情况下这是有道理的。但在这种情况下 - 不是 =)

【讨论】:

  • 感谢您花时间解释这一点。我只是创建狗的例子。上下文有点不同,但我明白你的意思。我还是会试试你的伎俩看看
猜你喜欢
  • 2016-07-25
  • 1970-01-01
  • 2015-11-04
  • 1970-01-01
  • 2014-04-17
  • 1970-01-01
  • 2011-01-22
  • 2017-12-09
  • 1970-01-01
相关资源
最近更新 更多