【问题标题】:PHP class property visibility issuePHP类属性可见性问题
【发布时间】:2020-09-29 19:28:30
【问题描述】:

我已经编写了许多类,并且最近认为我可以在一个公共父类中定义一个属性并让它对所有子类可见,但显然我似乎遇到了某种形式的范围问题并且不能确定我哪里出错了。

所以,我的课程如下;

class AppInit {
  protected $var;
}

class Jobs extends AppInit {
  public function setVar($val) {
    $this->var = $val;
  }
}

class Items extends AppInit {
  public function showVar() {
    echo $this->var;
  }
}

$obj1 = new Jobs();
$obj1->setVar(12345);

$obj2 = new Items();
$obj2->showVar();

# Nothing will print because AppInit->var is only defined within the instance that initiated it.

我遇到的问题是 $obj2 似乎无法看到其他类实例在父级别设置的受保护属性 $var。如何使 AppInit->var 在作为继承的一部分创建的所有 AppInit 实例中可见?

谢谢各位!

【问题讨论】:

  • 但它们是不同的实例。试图确保我没有遗漏任何东西。你想clone 可能吗?
  • 你没有设置在$obj2,你设置在$obj1
  • $obj2 instances $var 从未设置,因此为 NULL。可见度没有问题。
  • 这就是问题所在。我想在单个实例中初始化它并让它在任何其他实例中可用。这甚至可能吗?
  • @Skittles 是的,将其设为 static,以便所有类都可以访问它。

标签: php class oop


【解决方案1】:

有了这个:

class Jobs extends AppInit {
  public function setVar($val) {
    $this->var = $val;
  }
}

您有一个从Jobs 实例化的AppInit 实例

这里:

class Items extends AppInit {
  public function showVar() {
    echo $this->var;
  }
}

您正在拥有由Items 实例化的AppInit另一个 实例。

这就是为什么!

如果您想让varItemsJobs 相同,请将其设为静态。

【讨论】:

  • 将其设置为静态是正确的路径!当然...我需要更新代码以使用 parent::$var,但效果很好。谢谢你,Venelin!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-10
  • 2012-06-15
  • 1970-01-01
  • 2020-07-03
  • 2011-03-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多