OOP成员变量可见性

时间:2015-01-23 11:23:24

标签: php oop

我有一些课程可以扩展" 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!
}

5 个答案:

答案 0 :(得分:1)

使用

  

$这

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

foreach($this->wares as $w)

并在脚本末尾调用你的函数makehop():

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

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

答案 4 :(得分:0)

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