Php diri vs ini vs statis

Ini adalah topik yang paling menarik dan paling membingungkan di kalangan pengembang saat mengerjakan proyek apa pun. Dalam tutorial ini, kita akan mulai memahami self dan this di PHP & akan melihat kapan harus menggunakan self dan

// OUTPUT

1
1
2
2
1 di PHP saat pengembangan & akan memahami bagaimana kita bisa menggunakan self &
// OUTPUT

1
1
2
2
1 dalam berbagai situasi

Jadi, pertanyaan mendasar muncul di benak, apa itu self?

Seperti yang kita ketahui bahwa ketika kita membuat kelas apapun maka kelas tersebut berisi konstanta, variabel alias "properti", dan fungsi alias "metode"

Di OOP, untuk mengakses komponen kelas ini, kita bisa menggunakan $this ATAU self di PHP. Artinya, di PHP saja kita bisa menggunakan cara-cara ini untuk mengontrol komponen kelas yang berbeda. Ini mungkin berbeda berdasarkan bahasa pemrograman yang Anda gunakan

Daftar isi

Apa itu diri. di PHP?

Kelas dapat berisi penggabungan anggota statis & non-statis. Untuk mengakses anggota kelas statis, kami menggunakan self bersama dengan operator resolusi lingkup

// OUTPUT

1
1
2
2
7. Operator Resolusi Lingkup ini juga disebut Paamayim Nekudotayim (artinya titik dua dalam bahasa Ibrani) atau dengan kata yang lebih sederhana, titik dua ganda. Metode statis juga ditentukan sebagai fungsi global namespaced

Fungsi dan variabel statis dikaitkan dengan kelas itu sendiri. Itu berarti apa pun nilai yang dimiliki variabel statis, itu akan dibagikan di antara semua objek lain yang dibuat

Dengan kata sederhana, misalkan kita memperbarui variabel statis menggunakan

// OUTPUT

1
1
2
2
8, dan kemudian menggunakan
// OUTPUT

1
1
2
2
9 kita kembali mencoba mengakses variabel statis yang sama maka kita akan mendapatkan nilai yang sama dan sebaliknya

Mari kita lihat kode beraksi-

<?php

class books
{

  public static $bookId = 0;


  public function updateBookInfo($id)
  {
    self::$bookId = $id;
  }

  public function getBookId()
  {
    return self::$bookId;
  }

}
// object 1
// before update
$objBooks = new books;
$objBooks->updateBookInfo(1);

echo $objBooks->getBookId();

// object 2
$newObjBook = new books;
echo $newObjBook->getBookId();
$newObjBook->updateBookInfo(2);

// after update
echo $objBooks->getBookId();
echo $newObjBook->getBookId();
// OUTPUT

1
1
2
2

Oke, jadi dalam contoh ini, kami telah membuat kelas buku di mana kami telah mendefinisikan satu variabel statis (

<?php

class books
{
  public $bookId = 0;
  
  public function setBookId($id)
  {
    $this->bookId = $id;
  }
  public function getBookId()
  {
    return $this->bookId;
  }
}

$objBook = new books;
$objBook->setBookId(123);
echo $objBook->getBookId();
0) dan untuk mengaksesnya, kami telah mendefinisikan metode
<?php

class books
{
  public $bookId = 0;
  
  public function setBookId($id)
  {
    $this->bookId = $id;
  }
  public function getBookId()
  {
    return $this->bookId;
  }
}

$objBook = new books;
$objBook->setBookId(123);
echo $objBook->getBookId();
1. Sekarang, pertama-tama, kami telah membuat objek buku dan menetapkan nilai ke variabel statis
<?php

class books
{
  public $bookId = 0;
  
  public function setBookId($id)
  {
    $this->bookId = $id;
  }
  public function getBookId()
  {
    return $this->bookId;
  }
}

$objBook = new books;
$objBook->setBookId(123);
echo $objBook->getBookId();
0 menggunakan metode
<?php

class books
{
  public $bookId = 0;
  
  public function setBookId($id)
  {
    $this->bookId = $id;
  }
  public function getBookId()
  {
    return $this->bookId;
  }
}

$objBook = new books;
$objBook->setBookId(123);
echo $objBook->getBookId();
3

Metode ini menggunakan

<?php

class books
{
  public $bookId = 0;
  
  public function setBookId($id)
  {
    $this->bookId = $id;
  }
  public function getBookId()
  {
    return $this->bookId;
  }
}

$objBook = new books;
$objBook->setBookId(123);
echo $objBook->getBookId();
_4 sintaks untuk memperbarui variabel kelas
<?php

class books
{
  public $bookId = 0;
  
  public function setBookId($id)
  {
    $this->bookId = $id;
  }
  public function getBookId()
  {
    return $this->bookId;
  }
}

$objBook = new books;
$objBook->setBookId(123);
echo $objBook->getBookId();
0. Setelah ditugaskan, sekarang dapat tersedia untuk digunakan di dalam dan di luar kelas

Kita dapat mengakses nilai ini menggunakan metode

<?php

class books
{
  public $bookId = 0;
  
  public function setBookId($id)
  {
    $this->bookId = $id;
  }
  public function getBookId()
  {
    return $this->bookId;
  }
}

$objBook = new books;
$objBook->setBookId(123);
echo $objBook->getBookId();
1 dari dalam atau luar kelas ATAU langsung menggunakan kelas (
<?php

class books
{
  public $bookId = 0;
  
  public function setBookId($id)
  {
    $this->bookId = $id;
  }
  public function getBookId()
  {
    return $this->bookId;
  }
}

$objBook = new books;
$objBook->setBookId(123);
echo $objBook->getBookId();
7) dari luar kelas

Selanjutnya, kita telah mendefinisikan objek lain ________0______9. Sekarang, kita akan mendapatkan nilai yang sama dari

<?php

class books
{
  public $bookId = 0;
  
  public function setBookId($id)
  {
    $this->bookId = $id;
  }
  public function getBookId()
  {
    return $this->bookId;
  }
}

$objBook = new books;
$objBook->setBookId(123);
echo $objBook->getBookId();
0 menggunakan objek ini juga karena properti dari variabel tingkat kelas

Sekali, kami memperbarui nilai variabel statis ini menggunakan

<?php

class books
{
  public $bookId = 0;
  
  public function setBookId($id)
  {
    $this->bookId = $id;
  }
  public function getBookId()
  {
    return $this->bookId;
  }
}

$objBook = new books;
$objBook->setBookId(123);
echo $objBook->getBookId();
3 e. g. , 2 dalam kasus kita, maka nilai tersebut tersedia untuk semua objek (termasuk objek saat ini, berikutnya, dan sebelumnya)

Jadi,

// OUTPUT

123
1 &
// OUTPUT

123
2 akan memberikan nilai yang sama i. e. , 2

Bagaimana kita bisa mengakses anggota statis kelas?

Jadi, kita telah melihat pemahaman dasar tentang cara mendefinisikan variabel statis, cara mengaksesnya, dan bagaimana semua instance kelas berbagi variabel statis yang sama.

Ada berbagai cara untuk mengakses variabel statis

Jadi, variabel & fungsi statis diakses melalui

// OUTPUT

123
3 &
// OUTPUT

123
4 masing-masing (dari dalam kelas). Pada contoh di atas, variabel statis diakses menggunakan
// OUTPUT

123
5 saat kita berada di dalam kelas

Tetapi dari luar kelas, kita perlu menggunakan

<?php

class books
{
  public $bookId = 0;
  
  public function setBookId($id)
  {
    $this->bookId = $id;
  }
  public function getBookId()
  {
    return $this->bookId;
  }
}

$objBook = new books;
$objBook->setBookId(123);
echo $objBook->getBookId();
7 karena variabel statis adalah variabel tingkat kelas. Jadi tidak perlu membuat objek kelas untuk mengakses variabel statisnya. Kita dapat langsung mengaksesnya melalui className lalu operator resolusi lingkup (
// OUTPUT

1
1
2
2
7 ) diikuti dengan nama variabel

Terkadang kita juga melihat kata kunci

// OUTPUT

123
8 yang tugasnya mengakses metode kelas induk. Sintaks ini biasanya ditemukan di dalam metode seperti
// OUTPUT

123
9 di mana kami memasukkannya di baris pertama di dalam fungsi untuk mewarisi semua data konstruktor kelas induk. Kita juga bisa menggunakan parent. juga dalam metode lain. Tapi sebenarnya tidak ada hubungan seperti itu antara diri. & orang tua

Apa itu $this di PHP?

// OUTPUT

1
1
2
2
1 mewakili referensi ke objek kelas saat ini.
// OUTPUT

1
1
2
2
1 adalah variabel pseudo yang dibuat segera setelah objek kelas dibuat dan tersedia untuk digunakan setelah metode kelas dipanggil dari dalam konteks objek

Mari kita pahami $this menggunakan contoh dasar-

<?php

class books
{
  public $bookId = 0;
  
  public function setBookId($id)
  {
    $this->bookId = $id;
  }
  public function getBookId()
  {
    return $this->bookId;
  }
}

$objBook = new books;
$objBook->setBookId(123);
echo $objBook->getBookId();
// OUTPUT

123

Seperti yang bisa kita lihat, kita telah mendefinisikan dua metode di kelas

<?php

class books
{
  public $bookId = 0;
  
  public function setBookId($id)
  {
    $this->bookId = $id;
  }
  public function getBookId()
  {
    return $this->bookId;
  }
  public function getCurrentObjInfo() {
      print_r($this);
  }
}

$objBook = new books;
$objBook->setBookId(123);
$objBook->name = "Jack";
echo $objBook->getCurrentObjInfo();
2 dan satu digunakan untuk mengatur bookId dan yang lainnya digunakan untuk mendapatkan bookId. Untuk ini, kami menggunakan variabel
// OUTPUT

1
1
2
2
1 karena kami berada di dalam kelas dan kami berurusan dengan variabel non-statis kelas dari dalam konteks objek

Jadi, apa yang terkandung dalam

// OUTPUT

1
1
2
2
1?
// OUTPUT

1
1
2
2
1 berisi semua properti yang tersedia di dalam kelas. Mungkin ada kesalahpahaman bahwa ketika kita mencetak
// OUTPUT

1
1
2
2
1 maka itu akan memberikan daftar semua anggota dalam lingkup kelas

Tapi ini TIDAK benar.

// OUTPUT

1
1
2
2
1 akan mencetak semua variabel yang ada dan baru yang terkait dengan kelas itu sendiri

Ya itu benar. Kami juga dapat menambahkan variabel baru secara dinamis untuk penggunaan sementara ke kelas. Anda mungkin bingung sekarang karena kita telah melihat begitu banyak contoh yang berisi penggunaan properti yang didefinisikan di dalam kelas

Mari gunakan contoh kelas buku yang sama dan tentukan variabel dinamis yang ditentukan di luar kelas

<?php

class books
{
  public $bookId = 0;
  
  public function setBookId($id)
  {
    $this->bookId = $id;
  }
  public function getBookId()
  {
    return $this->bookId;
  }
  public function getCurrentObjInfo() {
      print_r($this);
  }
}

$objBook = new books;
$objBook->setBookId(123);
$objBook->name = "Jack";
echo $objBook->getCurrentObjInfo();
// OUTPUT

books Object 
( 
   [bookId] => 123 
   [name] => Jack 
)

Kami telah mendefinisikan metode baru

<?php

class books
{
  public $bookId = 0;
  
  public function setBookId($id)
  {
    $this->bookId = $id;
  }
  public function getBookId()
  {
    return $this->bookId;
  }
  public function getCurrentObjInfo() {
      print_r($this);
  }
}

$objBook = new books;
$objBook->setBookId(123);
$objBook->name = "Jack";
echo $objBook->getCurrentObjInfo();
8 dan di dalamnya, kami telah mencetak objek saat ini dengan mengirimkan parameter
// OUTPUT

1
1
2
2
1. Pada nomor baris 22, kami telah mendefinisikan variabel baru dan menugaskannya ke objek
// OUTPUT

books Object 
( 
   [bookId] => 123 
   [name] => Jack 
)
0

Jadi, ketika kita memanggil metode baru ini

<?php

class books
{
  public $bookId = 0;
  
  public function setBookId($id)
  {
    $this->bookId = $id;
  }
  public function getBookId()
  {
    return $this->bookId;
  }
  public function getCurrentObjInfo() {
      print_r($this);
  }
}

$objBook = new books;
$objBook->setBookId(123);
$objBook->name = "Jack";
echo $objBook->getCurrentObjInfo();
8 maka metode ini tidak hanya akan mencetak variabel yang sudah ada tetapi juga variabel dinamis yang baru didefinisikan.

Sekarang, mari kita bahas topik utamanya

Kapan harus menggunakan diri. di PHP?

Ini pertanyaan terbesar yang dihadapi semua orang saat mengembangkan perangkat lunak apa pun. Metode / properti kelas mana yang harus statis dan MENGAPA?

Di atas, kita telah melihat bahwa

// OUTPUT

1
1
2
2
1 mewakili referensi ke objek kelas saat ini, sedangkan self merujuk ke kelas saat ini itu sendiri

Untuk memahami ini mari kita buat kelas person dan kemudian kita akan melihat bagaimana menggunakan properti/metode statis dapat bermanfaat

<?php

class Person
{
  private $name = '';
  private $age  = '';
  private $address = '';
  private $familyMembers = '';

  public static $votingAge = 18;

  public function __construct($name, $age, $address, $familyMembers)
  {
    $this->name   = $name;
    $this->age    = $age;
    $this->height = $address;
    $this->weight = $familyMembers;
  }

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

  public function get_age()
  {
    return $this->age;
  }

  public function get_address()
  {
    return $this->address;
  }

  public function get_family_members()
  {
    return $this->familyMembers;
  }

  public static function set_voting_age($age)
  {
    self::$votingAge = $age;
  }

  public static function get_voting_age()
  {
    return self::$votingAge;
  }
}

Jadi, pada dasarnya kita telah mendefinisikan kelas Person dan juga menambahkan empat properti name, age, address & familyMembers

Kami kemudian membuat variabel statis votingAge karena mendeklarasikan votingAge statis, kami memastikan bahwa setiap objek yang dibuat menggunakan kelas Person harus berisi nilai votingAge statis yang sama

Ini adalah kami memastikan bahwa meskipun kami membuat objek kelas orang sebanyak mungkin, tetapi semua objek akan berbagi usia pemungutan suara yang sama

Keuntungan lain dari membuat properti statis ATAU menjadikan metode

// OUTPUT

books Object 
( 
   [bookId] => 123 
   [name] => Jack 
)
3 sebagai statis adalah kita tidak perlu membuat objek kelas Person untuk mengakses nilai default dari votingAge. Kita dapat langsung mengaksesnya dengan menggunakan
// OUTPUT

books Object 
( 
   [bookId] => 123 
   [name] => Jack 
)
4

Kapan menggunakan $this di PHP?

Berbeda dengan saat menggunakan self. di PHP, menggunakan $this hanya berguna ketika kita benar-benar perlu membuat objek kelas untuk mendefinisikan dan mengakses anggota kelas non-statis

$ini hanya menggunakan di dalam metode kelas. Jadi sekali objek kelas (mis. g. , Person) dibuat kemudian untuk mengakses semua anggota kita perlu menggunakan $this pseudo-variable

<?php

class Person
{
  private $name = '';

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

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

Kami telah mengurangi contoh di atas dan hanya menggunakan fungsi get_name() untuk mengakses nama orang tersebut. Karena nama properti ini dapat memiliki nama yang berbeda tergantung pada nilai yang diteruskan ke konstruktor

Jadi, untuk mengakses properti ini kita perlu menggunakan variabel $this

Singkatnya, mari kita lihat perbedaan antara diri. dan $ini

Selisih self dan $this di PHP

self$thisself merujuk ke kelas saat ini sendiri$this mewakili referensi ke objek kelas saat iniTidak perlu membuat instance objek untuk mengakses anggota statisMemerlukan pembuatan objek untuk mengakses metode dan variabeldiri. digunakan untuk mengakses variabel/metode statis dari kelas$ini digunakan untuk mengakses variabel/metode non-statis dari kelas

Kesimpulan

Kami telah melihat pemahaman mendalam tentang self dan $this di PHP. Jadi, pada dasarnya, kita perlu memastikan bahwa saat membuat kelas apa pun, apa tujuan kelas ini dan bagaimana berbagai komponen kelas akan membantu membuat kelas itu lengkap. Setelah kami membuat keputusan akhir, maka kami dapat menggunakan dengan tepat kapan menggunakan self dan kapan menggunakan $this

Apa perbedaan antara diri dan statis di PHP?

Diri baru. Diri adalah kata kunci dalam PHP. Ini mengacu pada kelas yang sama di mana kata kunci baru sebenarnya ditulis. Merujuk ke anggota kelas, tetapi tidak untuk objek tertentu . Ini karena anggota statis (variabel atau fungsi) adalah anggota kelas yang digunakan bersama oleh semua objek kelas.

Apa perbedaan antara diri dan ini di PHP?

self digunakan untuk mengakses variabel atau metode statis atau kelas dan ini digunakan untuk mengakses variabel atau metode non-statis atau objek . Jadi gunakan self saat ada kebutuhan untuk mengakses sesuatu yang termasuk dalam kelas dan gunakan $this saat ada kebutuhan untuk mengakses properti milik objek kelas.

Apa perbedaan antara diri dan statis dalam membuat objek?

Apa perbedaan antara new self dan new static ? . self refers to the same class in which the new keyword is actually written. statis , dalam PHP 5. 3 binding statis terakhir, mengacu pada kelas apa pun dalam hierarki tempat Anda memanggil metode . Dalam contoh berikut, B mewarisi kedua metode dari A.

Bisakah kita menggunakan $this dalam fungsi statis PHP?

Karena metode statis dapat dipanggil tanpa turunan dari objek yang dibuat, variabel pseudo $this tidak tersedia di dalam metode yang dideklarasikan sebagai statis . Memanggil metode non-statis secara statis melempar Kesalahan. Sebelum PHP 8. 0.