Rumah >pembangunan bahagian belakang >tutorial php >PHP OOP Bahagian-Statik harta, kaedah dan ini vs diri

PHP OOP Bahagian-Statik harta, kaedah dan ini vs diri

Patricia Arquette
Patricia Arquetteasal
2025-01-04 16:36:41647semak imbas

PHP OOP Part-Static property, method and this vs self

Dalam siri ini, saya akan membincangkan asas-asas Pengaturcaraan Berorientasikan Objek PHP (OOP). Kandungan akan disusun mengikut bahagian berurutan, setiap satu memfokuskan pada topik tertentu. Jika anda seorang pemula atau tidak biasa dengan konsep OOP, siri ini direka bentuk untuk membimbing anda langkah demi langkah. Dalam bahagian ini, saya akan membincangkan tentang sifat statik, kaedah dan ini vs diri dalam PHP. Mari kita mulakan perjalanan belajar PHP OOP bersama-sama!

Apakah harta dan kaedah?

Pertama, mari kita cuba memahami sifat dan kaedah. Apabila kita mencipta berbilang objek menggunakan kelas, setiap objek diperuntukkan lokasi memori yang berasingan. Akibatnya, semua sifat dan kaedah objek itu juga diperuntukkan kepada lokasi ingatan khusus tersebut.

Ini bermakna apabila kita menukar mana-mana sifat objek, perubahan itu terhad kepada objek tertentu sahaja. Ia tidak menjejaskan mana-mana objek lain kerana sifat dan kaedah kelas dikaitkan dengan objek masing-masing kelas itu.

Untuk mengakses sifat atau kaedah ini dari luar kelas, kita perlu mencipta objek kelas tersebut. Walau bagaimanapun, jika kita ingin mengakses sifat atau kaedah ini dalam kelas, kita boleh menggunakan kata kunci $this. Kata kunci $this mewakili objek semasa kelas. Kami akan mengetahui lebih lanjut tentang kata kunci $ini kemudian. Mari kita lihat contoh berikut:

Contoh Kod

class Car
{
   public $name;
   public $color;

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

   public function getValue()
   {
      echo "Car name: $this->name\n";
      echo "Car color: $this->color\n";
   }
}

$tesla = new Car('Zip', 'Blue');
$tesla->getValue();

Dalam contoh ini, kita dapat melihat bahawa untuk mengakses sifat kelas, kita telah menggunakan kata kunci $this dalam kaedah kelas yang sama. Begitu juga, untuk menggunakan mana-mana kaedah kelas ini dari luar, kami telah mencipta objek kelas. Beginilah lazimnya kami menggunakan sifat atau kaedah biasa kelas.

Apakah sifat dan kaedah statik?

Walau bagaimanapun, sifat atau kaedah statik berfungsi secara berbeza. Apabila kita mentakrifkan kelas, ia diperuntukkan lokasi memori sekali sahaja. Begitu juga, apabila kita mentakrifkan sifat atau kaedah statik dalam kelas, ia juga diperuntukkan kepada lokasi memori tertentu di samping kelas itu sendiri, tetapi hanya sekali.

Akibatnya, jika kami mengubah suai mana-mana sifat atau kaedah statik kemudian, perubahan itu akan mencerminkan semua kejadian kelas. Dalam erti kata lain, di mana sahaja sifat atau kaedah statik digunakan, nilai kemas kininya akan tersedia.

Jika kita ingin mengakses sifat atau kaedah statik dari luar kelas, kita boleh menggunakan :: (pengendali resolusi skop) tanpa mencipta objek. Sebagai alternatif, kita juga boleh mengaksesnya selepas mencipta objek. Untuk mengaksesnya dari dalam kelas, kita boleh menggunakan kata kunci diri atau nama kelas itu sendiri. Di sini, kata kunci diri mewakili kelas.

Kami akan meneroka kata kunci diri dengan lebih terperinci kemudian. Mari kita lihat contoh berikut:

Contoh Kod

class Car
{
   public $name;
   public $color;

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

   public function getValue()
   {
      echo "Car name: $this->name\n";
      echo "Car color: $this->color\n";
   }
}

$tesla = new Car('Zip', 'Blue');
$tesla->getValue();

Dalam contoh ini, kita dapat melihat bahawa untuk mengakses sifat statik kelas, kita telah menggunakan kata kunci diri dalam kaedah kelas yang sama. Selain itu, untuk menggunakan kaedah statik dari luar kelas, kami mencipta objek kelas. Walau bagaimanapun, kami juga boleh mengaksesnya secara terus menggunakan nama kelas bersama-sama dengan :: (pengendali resolusi skop), tanpa membuat objek. Beginilah lazimnya kami menggunakan sifat statik atau kaedah kelas.

Dalam contoh di atas, kita dapat melihat bahawa menggunakan kelas Kereta, kita mencipta dua objek, $toyota dan $bmw, dengan data yang berbeza. Sekarang kita mahu mengakses nilai objek ini. Jika kita menjalankan kod di atas, kita akan melihat output berikut:

Contoh Kod

class Car
{
   public static $name;
   public static $color;

   function __construct($name, $color)
   {
      self::$name = $name;
      self::$color = $color;
   }

   public static function getValue()
   {
      echo "Car name: " . self::$name . "\n";
      echo "Car color: " . self::$color . "\n";
   }
}

$toyota = new Car('Toyota', 'Black');
$bmw = new Car('BMW', 'Orange');

$toyota::getValue();
$bmw::getValue();

Car::getValue();

Kita dapat melihat bahawa kedua-dua objek menunjukkan nilai yang sama. Dalam erti kata lain, nilai yang kami peroleh adalah daripada objek yang paling baru dibuat. Walaupun apabila kami cuba mengakses nilai secara terus melalui kelas, kami masih mendapat nilai yang sama, iaitu, nilai objek kedua.

Alasan untuk ini agak jelas. Seperti yang dinyatakan sebelum ini, sifat atau kaedah statik dicipta dalam satu lokasi memori. Jika sifat atau kaedah statik ditukar dari mana-mana sahaja, perubahan itu mempengaruhi semua kejadian kelas.

Dalam contoh di atas, apabila kita mencipta objek kedua, nilai sifat berubah sebaik sahaja objek itu dicipta. Perubahan ini turut mempengaruhi objek yang dibuat sebelum ini kerana semua objek kelas berkongsi sifat atau kaedah statik yang sama.

Adalah penting untuk diingat bahawa sifat statik atau kaedah kelas tidak boleh digunakan dengan cara yang sama seperti sifat atau kaedah kelas biasa. Anda tidak boleh menggunakan operator → untuk mengaksesnya. Sebaliknya, anda mesti menggunakan ::(operator resolusi skop), sama ada anda mengaksesnya dari dalam atau luar kelas.

Kata kunci $this vs self

Apakah $ini?

Kami telah pun melihat penggunaan kata kunci $this dan self. Sekarang, mari kita mendalami konsep ini untuk lebih memahaminya.

$ini ialah kata kunci PHP terbina dalam. Apabila kita mencipta satu atau lebih objek menggunakan kelas, sifat dan kaedah biasa yang ditakrifkan dalam kelas boleh diakses menggunakan kata kunci $this dari dalam kelas.

Sekarang, kita tahu bahawa apabila kelas ditakrifkan, ia diperuntukkan kepada lokasi memori tertentu sekali sahaja. Ini mungkin menimbulkan persoalan: jika kita mencipta berbilang objek daripada kelas ini, adakah kata kunci $this akan mengakses sifat atau kaedah sekali sahaja untuk semua objek?

Jawapannya ialah "Tidak". Ini kerana, seperti yang telah kita bincangkan, kata kunci $this tidak mewakili kelas itu sendiri sebaliknya objek yang dicipta oleh kelas tersebut. Dalam erti kata lain, $ini berkaitan secara langsung dengan objek. Akibatnya, untuk setiap objek yang dicipta, kata kunci $this akan mengakses sifat dan kaedah kelas secara berasingan untuk setiap objek. Mari kita lihat contoh berikut:

class Car
{
   public $name;
   public $color;

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

   public function getValue()
   {
      echo "Car name: $this->name\n";
      echo "Car color: $this->color\n";
   }
}

$tesla = new Car('Zip', 'Blue');
$tesla->getValue();

Dalam contoh sebelumnya, kami telah menggunakannya beberapa kali, tetapi penggunaan $this tidak dibincangkan secara terperinci. Sekarang setelah kita mendapat sedikit pemahaman tentang $ini, kita boleh memahami penggunaannya dengan lebih baik. Menggunakan kelas ini, kami telah mencipta objek. Kini, kami faham bahawa kata kunci $this mengakses sifat secara berasingan untuk setiap objek.

Walau bagaimanapun, adalah penting untuk ambil perhatian bahawa kata kunci $this tidak boleh digunakan dalam kaedah statik. Mengapa ia tidak boleh digunakan akan diterangkan sebentar lagi.

Apakah kata kunci diri?

Kita sudah tahu bahawa apabila kelas ditakrifkan, ia diperuntukkan kepada lokasi memori sekali sahaja. Begitu juga, semua sifat statik dan kaedah dalam kelas itu juga diperuntukkan kepada lokasi memori bersama-sama dengan kelas, sekali sahaja.

Akibatnya, apabila kita mencipta objek menggunakan kelas ini, sifat atau kaedah statik tidak dicipta secara berasingan untuk setiap objek. Inilah sebabnya kami tidak boleh mengakses sifat atau kaedah statik ini menggunakan kata kunci $this. Kata kunci $this mewakili objek kelas dan memandangkan sifat atau kaedah statik tidak berkaitan dengan mana-mana objek tetapi terus kepada kelas itu sendiri, kata kunci itu tidak boleh diakses menggunakan $this.

Untuk mengakses sifat atau kaedah statik dalam kelas, kami menggunakan kata kunci kendiri atau nama kelas bersama-sama dengan ::(operator resolusi skop). Ini kerana kata kunci diri mewakili kelas itu sendiri. Mari kita lihat contoh berikut:

class Car
{
   public static $name;
   public static $color;

   function __construct($name, $color)
   {
      self::$name = $name;
      self::$color = $color;
   }

   public static function getValue()
   {
      echo "Car name: " . self::$name . "\n";
      echo "Car color: " . self::$color . "\n";
   }
}

$toyota = new Car('Toyota', 'Black');
$bmw = new Car('BMW', 'Orange');

$toyota::getValue();
$bmw::getValue();

Car::getValue();

Dalam contoh ini, kami melihat bahawa kami boleh mengakses ahli statik dengan mudah dalam kaedah bukan statik menggunakan nama kelas atau kata kunci diri dengan pengendali resolusi ::skop, kerana ia berkaitan dengan kelas. Oleh itu, untuk mengaksesnya, kita tidak perlu mencipta objek yang berasingan.

Walau bagaimanapun, jika kami ingin mengakses ahli bukan statik dalam kaedah statik, kami perlu menggunakan kata kunci $this. Tetapi kita tahu bahawa kata kunci $this tidak boleh digunakan dalam kaedah statik kerana $ini berkaitan dengan objek, manakala ahli bukan statik tidak berkaitan dengan objek. Inilah sebabnya kami tidak boleh menggunakan kata kunci $this dalam kaedah statik.

Walau bagaimanapun, jika kita perlu mengakses ahli bukan statik dalam kaedah statik, kita boleh mencipta contoh atau objek kelas dalam kaedah statik dan kemudian menggunakan kata kunci $this untuk mengaksesnya, seperti yang ditunjukkan dalam contoh di atas .

Saya harap ini memberi anda pemahaman yang lebih jelas tentang penggunaan $this dan kata kunci diri. Itu sahaja untuk hari ini; kita sambung dalam pelajaran seterusnya.

Anda boleh berhubung dengan saya di GitHub dan Linkedin.

Atas ialah kandungan terperinci PHP OOP Bahagian-Statik harta, kaedah dan ini vs diri. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn