Cara mengakses variabel kelas induk di kelas anak di php

Saat objek dibuat, semua properti non-privat dari semua kelas induk menjadi milik objek yang baru dibuat ini. Dia tidak tahu properti mana yang menjadi milik kelas tempat pembuatannya, dan properti mana yang menjadi milik induknya

Bisakah anak dan orang tua memiliki nilai yang berbeda pada waktu yang sama, mungkin dalam konteks yang berbeda?

Hanya jika Anda membuat dua objek berbeda, seperti itu (saya menambahkan metode pengambil)

$childEntity = new ChildEntity(5);
var_dump($childEntity->getClassParameter());

$parentEntity = new ParentEntity(6);
var_dump($parentEntity->getClassParameter());

Mengapa di bawah ini berfungsi?

Ketika Anda menulis kode berikut

class ParentEntity
{
    function __construct(int $classParameter)
    {
        $this->classParameter = $classParameter;
    }
}
_

yaitu, Anda menginisialisasi properti di konstruktor tanpa mendeklarasikannya, php secara internal mendeklarasikannya sendiri. Dan saat Anda membuat ChildEntity, semuanya terjadi persis sama seperti yang sudah saya jelaskan. Saya harus menyebutkan bahwa php menetapkan properti yang tidak dideklarasikan ini visibilitas public - meskipun, betapapun gilanya, itu bertentangan dengan Prinsip Pergantian Liskov. Coba lihat

Ketika suatu kelas berasal dari kelas lain, itu dikenal sebagai pewarisan. Berikut adalah beberapa istilah penting terkait pewarisan dalam PHP

  • Kelas Induk – Kelas dari mana kelas-kelas lain berasal disebut kelas induk. Ini juga dikenal sebagai kelas dasar
  • Kelas Anak – Kelas yang berasal dari kelas lain disebut kelas anak. Ada beberapa nama lain untuk itu juga seperti kelas daun atau kelas turunan
Cara mengakses variabel kelas induk di kelas anak di php
Warisan dalam PHP

Bagaimana cara mewarisi kelas di PHP?

Kelas dapat diwariskan dengan menggunakan kata kunci extends. Lihatlah contoh berikut

<?php
class Fruit {
    protected $name;
    protected $color;

    public function __construct($name, $color) {
        $this->name = $name;
        $this->color = $color;
    }

    public function getName() {
        return $this->name;
    }

    public function getColor() {
        return $this->color;
    }
}

class Apple extends Fruit {
    protected $variety;

    public function __construct($name, $color, $variety) {
        parent::__construct($name, $color);
        $this->variety = $variety;
    }

    public function getVariety() {
        return $this->variety;
    }
}

$apple = new Apple('Apple', 'Red', 'Fuji');
echo $apple->getName(); // Output: Apple
echo $apple->getColor(); // Output: Red
echo $apple->getVariety(); // Output: Fuji
?>

Dalam contoh ini, kelas Apple memperluas kelas Buah, yang berarti bahwa kelas Apple berisi semua atribut dan metode kelas Buah selain miliknya sendiri. Konstruktor kelas Apple menggunakan induk. construct() untuk memanggil konstruktor induk, menyediakan parameter yang sesuai. Kemudian, dengan menggunakan pewarisan, Anda dapat membuat instance kelas Apple dan mengakses fungsi dari kelas induk

Untuk meringkas di atas

  1. Warisan memungkinkan kelas anak untuk mengakses __construct publik, metode, dan properti dari kelas induk
  2. Pada contoh di atas, kita dapat mengakses metode kelas apple menggunakan objeknya, serta metode kelas induk

Cakupan pengubah akses yang dilindungi di Inheritance

Dalam tutorial sebelumnya, kita belajar bahwa atribut/metode yang dilindungi dari suatu kelas dapat diakses di dalam kelas dan kelas diturunkan darinya

Untuk memahami ruang lingkup pengubah akses yang dilindungi dalam pewarisan, mari kita lihat contoh berikut

<?php
class Fruit {
  public $name;
  public $color;
  public function __construct($name, $color) {
    $this->name = $name;
    $this->color = $color;
  }
  protected function intro() {
    echo "I am $this->name and my color is $this->color";
  }
}

class Apple extends Fruit {
  public function message() {
    echo "I am from Fruit class or Apple one?";
  }
}

$apple = new Apple("Apple", "red");
$apple->message();
$apple->intro();
?>

Dalam contoh di atas

  • Kami membuat kelas yang disebut buah yang memiliki karakteristik publik tertentu dan fungsi yang dilindungi
  • Kami membangun kelas lain, apel, yang diperluas dari Buah dan memiliki turunannya sendiri
  • Ketika kami mencoba mengakses metode yang dilindungi dari kelas Buah menggunakan objek kelas apel, itu memberikan kesalahan karena kami mencoba mengakses anggota yang dilindungi dari kelas Buah di luar kelas turunan

Mari kita lihat contoh lain, yang pada dasarnya adalah versi modifikasi dari yang terakhir

<?php
class Fruit {
  public $name;
  public $color;
  public function __construct($name, $color) {
    $this->name = $name;
    $this->color = $color;
  }
  protected function intro() {
    echo "I am {$this->name} and my color is {$this->color}.";
  }
}

class Apple extends Fruit {
  public function message() {
    echo "Am I a fruit or an apple? ";
    $this -> intro(); // protected
  }
}

$apple = new Apple("Apple", "red");
$strawberry->message();
?>
_

Karena kita mengaksesnya di dalam kelas pada contoh sebelumnya, metode yang dilindungi dari kelas Fruit tersedia di kelas apple

Mengesampingkan Warisan

Mengesampingkan berarti mendefinisikan ulang metode kelas induk di kelas anak dengan nama yang sama. Pertimbangkan contoh penggantian warisan berikut

<?php
class Fruit {
  public $name;
  public $color;
  public function __construct($name, $color) {
    $this->name = $name;
    $this->color = $color;
  }
  public function intro() {
    echo "I am {$this->name} and my color is {$this->color}.";
  }
}

class Apple extends Fruit {
  public $weight;
  public function __construct($name, $color, $weight) {
    $this->name = $name;
    $this->color = $color;
    $this->weight = $weight;
  }
  public function intro() {
    echo "I am {$this->name}, my color is {$this->color}. Also, my weight is {$this->weight} kg.";
  }
}

$apple= new Apple("Apple", "red", 50);
$apple->intro();
?>

Dalam contoh di atas

  • Mengesampingkan berarti mengganti nama metode kelas induk di kelas anak. Perhatikan contoh overriding dalam pewarisan berikut
  • Perlu dicatat bahwa metode __construct dan intro di kelas anak apple memiliki nama yang sama. Namun, parameternya mungkin berbeda
  • Kami membuat instance dari kelas apple dan mengirimkan argumen ke metode build
  • Karena kita membuat instance objek apple menggunakan konstruktor kelas apple, saat kita memanggil metode intro menggunakan instance apple, ia akan memanggil fungsi intro dari class apple

Peran Kata Kunci Akhir dalam pewarisan

Kata kunci final melarang kelas anak/turunan untuk mengesampingkan fungsi kelas induk/kelas dasar. Lihat contoh berikut untuk melihat bagaimana kata kunci Final digunakan

<?php
class Fruit {
  final public function intro() {
    // code
  }
}

class Apple extends Fruit {
// error to override the intro
  public function intro() {
    // code
  }
}
?>
_

Kelas apel mencoba mengganti metode intro pada contoh sebelumnya. Itu akan menimbulkan kesalahan karena kami menggunakan kata kunci final dengan fungsi intro kelas Buah

Bisakah kelas anak mengakses variabel induk?

Satu-satunya aspek yang tidak biasa adalah, dalam definisi metode kelas anak, Anda tidak dapat langsung mengakses variabel instance kelas induk . Misalnya, jika induk memiliki variabel instan tinggi, definisi metode kelas anak tidak akan dapat mengaksesnya secara langsung.

Bagaimana Anda mengakses kelas induk dari seorang anak?

Gunakan kata kunci super untuk mengakses metode kelas induk . Anda mengganti metode di kelas induk dengan memanggil metode yang sama di kelas anak. Proses ini dikenal sebagai metode overriding.

Bagaimana cara mengakses kelas induk di PHP?

Untuk memanggil konstruktor kelas induk dari konstruktor kelas anak, Anda menggunakan induk. sintaks __construct(arguments) . Sintaks untuk memanggil konstruktor induk sama dengan metode biasa.

Bisakah kelas induk mengakses atribut kelas anak?

Tetapi karena variabel referensi kelas induk menunjuk ke objek sub kelas. Jadi memungkinkan untuk mengakses properti kelas anak dengan objek kelas induk jika hanya down casting yang diizinkan atau dimungkinkan .