OOP 成员变量可见性


OOP member variable visibility

我有几个扩展"Shop"的类,最好的方法是什么,以便父函数即:list_items()可以在子类上使用?

class Shop
{
   public function list_items() {
      foreach($wares as $w)
        echo $w;
   }
   public function buy($item){
   }
}
class Brewery extends Shop
{
   public $wares = array("Wine", "Beer", "Alcohol", "Sake", "Rum");
   public $keepers = array("Jack", "Jill", "Bob", "Sam");
}
function makeShop() //initialize a shop obj
{
  $s = new Brewery();
  $s->list_items(); //$wares is not visible!
}

使用

$this

在你的商店类中。$this 是非静态属性或方法的关键字。使用$this,您可以访问所有类属性,例如公共$wares。如果没有$this,您将无法访问类属性 - 此变量是未知的。

foreach($this->wares as $w)

并在脚本末尾调用函数 makeshop():

makeshop();

如此完整:

<?php
class Shop
{
   public function list_items() {
      foreach($this->wares as $w)
        echo $w;
   }
   public function buy($item){
   }
}
class Brewery extends Shop
{
   public $wares = array("Wine", "Beer", "Alcohol", "Sake", "Rum");
   public $keepers = array("Jack", "Jill", "Bob", "Sam");
}
function makeShop() //initialize a shop obj
{
  $s = new Brewery();
  $s->list_items(); //$wares is not visible!
}
makeshop();
?>

$wares确实是未定义的,因为您应该使用 $this->wares 访问它。

此外,始终将方法和属性的可见性限制到最大。例如。在这里您可以将其设置为 protected .

接下来的事情是你应该坚持一个命名约定。在一个项目中使用 makeShoplist_items并不是一个好主意。

当你扩展一个类时,你会继承它的所有函数。因此,只需像使用任何其他类方法一样使用 $this->list_items() 引用它们。

$wares

可见,因为它不是来自任何地方。

将其作为函数参数传递或将其用作类成员:

public function list_items($wares) {
  foreach($wares as $w)
    echo $w;
}

或:

class Shop
{
   public $wares = [];
   public function list_items() {
      foreach($this->wares as $w)
        echo $w;
   }
   public function buy($item){
   }
}

您可以在其他类中使用 Shop 中的所有公共方法和受保护方法。