OOP 成员变量可见性

OOP member variable visibility

我有一些 类 扩展了 "Shop",最好的方法是什么,以便父函数即 list_items() 可以用于子 [=15] =]?

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

在您的商店中进行 foreach Class。 $this 是非静态属性或方法的关键字。 使用 $this,您可以访问所有 class 属性,例如 public $wares。 没有 $this 你不能访问你的 class 属性 - 这个变量是未知的。

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();
?>

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

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

访问它

同时始终将方法和属性的可见性限制在最大值。例如。这里可以设置为protected.

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

当您扩展 class 时,您会继承它的所有功能。因此,只需像使用任何其他 class 方法一样使用 $this->list_items() 来引用它们。

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

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

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){
   }
}