Dziedziczenie pól klasy bazowej

0

Nadszedł w końcu czas na naukę OOP. Niemal na samym starcie mam małą zagwozdkę...
Kod wygląda następująco:

class Samochod
{
	public $marka;
	public $model;
	private $zbiornik = 50;

	public function __construct($marka, $model)
	{
		$this->marka = $marka;
		$this->model = $model;
	}

	public function setZbiornik($zbiornik)
	{
		$this->zbiornik = intval($zbiornik);
	}

	public function getZbiornik(): int
	{
		return $this->zbiornik;
	}

}

class Osobowka extends Samochod
{
	public $liczba_miejsc;
}

$sam = new Osobowka('opel', 'astra');
$sam->liczba_miejsc = 5;

Natomiast wykonanie funkcji

var_dump($sam);

Zwraca

object(Osobowka)[1]
  public 'liczba_miejsc' => int 5
  public 'marka' => string 'opel' (length=4)
  public 'model' => string 'astra' (length=5)
  private 'zbiornik' (Samochod) => int 50

Zgodnie z tym co wyczytałem w tutorialach pole zbiornik nie powinno być widoczne w klasie Osobowka. Dlaczego?
//Testowane w wersji PHP 7.3.3

4

No i nie jest. Przekonasz się, jak spróbujesz się do niego odwołać z poziomu osobówki.
Inną sprawą jest fakt, że ono nadal tam jest i jeśli w klasie nadrzednej miałbyś publiczną lub chronioną metodę, która operuje na tym polu, to bez problemu mógłbyś tę metodę wywołać.

Więc to pole tam jest. Nie jest widoczne, bo się do niego nie odwolasz z klasy dziedziczącej, ale na var_dump() je widać, bo pokazuje Ci całość obiektu, łącznie z polami odziedziczonymi, których bezpośrednio nie wykorzystasz :)

0
Klojtex napisał(a):

No i nie jest. Przekonasz się, jak spróbujesz się do niego odwołać z poziomu osobówki.
Inną sprawą jest fakt, że ono nadal tam jest i jeśli w klasie nadrzednej miałbyś publiczną lub chronioną metodę, która operuje na tym polu, to bez problemu mógłbyś tę metodę wywołać.

Więc to pole tam jest. Nie jest widoczne, bo się do niego nie odwolasz z klasy dziedziczącej, ale na var_dump() je widać, bo pokazuje Ci całość obiektu, łącznie z polami odziedziczonymi, których bezpośrednio nie wykorzystasz :)

Racja echo $sam->zbiornik; zwraca błąd. Dzięki za ekspresowe i wyczerpujące wyjaśnienie :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1