我有一些课程可以扩展" 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!
}
答案 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
。
接下来就是你应该坚持一个命名约定。在一个项目中使用makeShop
和list_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中的所有公共和受保护方法。