2015-01-23 2 views
1

У меня есть несколько классов, которые расширяют «магазин», что лучший способ сделать это, чтобы родительские функции, то есть: 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! 
} 

ответ

1

использование

$ это

в Еогеасп в вашем магазине класса. $ это ключевое слово для нестатических атрибутов или методов. с $ this вы можете получить доступ ко всем вашим атрибутам класса, таким как public $ 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(); 
?> 
0

Вы можете использовать все открытые и защищенные методы из магазина в другие классы.

1

$wares действительно не определено, потому что вы должны получить к нему доступ, используя $this->wares.

Также всегда ограничивайте доступность методов и атрибутов максимально. Например. здесь вы можете установить его на protected.

Следующее - это то, что вы должны придерживаться одного соглашения об именах. Использование makeShop и list_items в одном проекте - не очень хорошая идея.

1

Когда вы расширяете класс, вы наследуете все его функции. Поэтому просто обратитесь к ним, используя $this->list_items(), как и любой другой метод класса.

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){ 
    } 
} 
Смежные вопросы