Dziedziczenie pól klasy bazowej

Dziedziczenie pól klasy bazowej
Łukasz Mikowski
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 64
0

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

Kopiuj
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

Kopiuj
var_dump($sam);

Zwraca

Kopiuj
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

KL
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 191
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 :)

Łukasz Mikowski
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 64
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 :)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.