Objek di PHP5 telah disesuaikan secara lebih sistematis dan komprehensif, dan tampilannya saat ini mungkin terlihat mirip dengan Java. Bagian ini berfokus pada mode objek baru di PHP5 dan memberikan beberapa contoh sederhana untuk diilustrasikan. Biarkan bagian ini menjadi titik awal baru untuk perjalanan PHP5 Anda. :)
* Konstruktor dan destruktor
* Referensi objek
*Klon objek
* Mode pribadi, publik, dan dilindungi dalam objek
* Antarmuka
* Kelas abstrak
* __panggilan
* __set dan __dapatkan
* Anggota statis
Konstruktor dan destruktor
Dalam PHP4, ketika suatu fungsi memiliki nama yang sama dengan objek, fungsi tersebut akan menjadi konstruktor objek tersebut, dan tidak ada konsep destruktor di PHP4.
Di PHP5, konstruktor diberi nama seragam __construct, dan konsep destruktor diperkenalkan, yang diberi nama seragam __destruct.
Contoh 1: Konstruktor dan destruktor
kelas foo {
var $x;
fungsi __konstruksi($x) {
$ini->x = $x;
}
tampilan fungsi() {
cetak($ini->x);
}
fungsi __menghancurkan() {
print("selamat tinggal");
}
}
$o1 = foo baru(4);
$o1->tampilan();
?>
Dalam contoh di atas, ketika Anda mengakhiri panggilan ke kelas foo, destruktornya akan dipanggil, dan "bye bye" akan ditampilkan pada contoh di atas.
referensi objek
, di PHP4, meneruskan variabel ke suatu fungsi atau metode sebenarnya membuat salinan variabel, yang berarti apa yang Anda teruskan ke fungsi atau metode adalah salinan variabel, kecuali Anda menggunakan referensi . Simbol "&" digunakan untuk menyatakan bahwa suatu referensi harus dibuat, bukan salinan. Di PHP5, objek selalu ada dalam bentuk referensi, dan operasi penugasan pada objek juga merupakan operasi referensi.
Contoh 2: Referensi objek
kelas foo {
var $x;
fungsi setX($x) {
$ini->x = $x;
}
fungsi getX() {
kembalikan $ini->x;
}
}
$o1 = foo baru;
$o1->setX(4);
$o2 = $o1;
$o1->setX(5);
if($o1->getX() == $o2->getX()) print("Ya Tuhan!");
?>
Kloning Objek
Seperti disebutkan di atas, ketika suatu objek selalu dipanggil dalam bentuk referensi, apa yang harus saya lakukan jika saya ingin mendapatkan salinan objek tersebut? PHP5 menyediakan fungsi baru yaitu kloning objek, dan sintaksnya adalah __clone.
Contoh 3: Kloning objek
kelas foo {
var $x;
fungsi setX($x) {
$ini->x = $x;
}
fungsi getX() {
kembalikan $ini->x;
}
}
$o1 = foo baru;
$o1->setX(4);
$o2 = $o1->__klon();
$o1->setX(5); if($o1->getX() != $o2->getX()) print("Salinan bersifat independen");
?>
Metode kloning objek ada dalam banyak bahasa aplikasi lainnya, jadi Anda tidak perlu khawatir tentang stabilitasnya. :)
Mode privat, publik, dan terlindungi dalam objek
Di PHP4, semua metode dan variabel suatu objek bersifat publik, artinya Anda dapat mengoperasikan variabel dan metode apa pun di luar objek. PHP5 memperkenalkan tiga mode baru untuk mengontrol izin akses ini: Publik, Terlindungi, dan Pribadi.
Mode Publik (Publik): memungkinkan kontrol operasi di luar objek.
Mode Pribadi (Pribadi): Hanya metode dalam objek ini yang diizinkan untuk mengoperasikan dan mengendalikannya.
Mode terproteksi (Terlindungi): Mengizinkan objek ini dan objek induknya mengoperasikan dan mengendalikannya.
Contoh 4: Mode privat, publik, dan terlindungi pada objek
kelas foo {
pribadi $x;
fungsi publik public_foo() {
print("Saya publik");
}
fungsi dilindungi protected_foo() {
$this->private_foo(); //Oke karena kita berada di kelas yang sama, kita dapat memanggil metode privat
print("Saya terlindungi");
}
fungsi pribadi private_foo() {
$ini->x = 3;
print("Saya pribadi");
}
}
kelas foo2 meluas foo {
tampilan fungsi publik() {
$ini->dilindungi_foo();
$ini->public_foo();
// $this->private_foo(); // Tidak valid! fungsi bersifat pribadi di kelas dasar
}
} $x = foo baru();
$x->public_foo();
//$x->protected_foo(); //Invalid tidak dapat memanggil metode yang dilindungi di luar kelas dan kelas turunan
//$x->private_foo(); //Metode privat yang tidak valid hanya dapat digunakan di dalam kelas $x2 = new foo2();
$x2->tampilan();
?>
Tip: Variabel dalam objek selalu ada dalam bentuk pribadi. Variabel yang dioperasikan secara langsung dalam suatu objek bukanlah kebiasaan pemrograman berorientasi objek yang baik. Cara yang lebih baik adalah dengan menyerahkan variabel yang Anda inginkan ke metode objek untuk diproses.
Antarmuka
Seperti kita ketahui, objek di PHP4 mendukung pewarisan. Untuk menjadikan suatu objek sebagai kelas turunan dari objek lain, Anda perlu menggunakan kode yang mirip dengan "class foo extends parent" untuk mengontrolnya. Di PHP4 dan PHP5, sebuah objek hanya dapat diwarisi satu kali, dan pewarisan berganda tidak didukung. Namun, istilah baru lahir di PHP5: antarmuka. Antarmuka adalah objek khusus tanpa kode pemrosesan khusus. Antarmuka hanya mendefinisikan nama dan parameter beberapa metode. Setelah itu, objek dapat digunakan dengan mudah dengan kata kunci 'implement'. Antarmuka yang diperlukan diintegrasikan, dan kemudian kode eksekusi spesifik ditambahkan.
Contoh 5: Antarmuka
antarmuka dapat ditampilkan {
tampilan fungsi();
}
antarmuka dapat dicetak {
fungsi cetak();
}
class foo mengimplementasikan dapat ditampilkan, dapat dicetak {
tampilan fungsi() {
// kode
} fungsi pencetakan() {
// kode
}
}
?>
Hal ini sangat membantu untuk meningkatkan keterbacaan dan popularitas kode. Dari contoh di atas, kita dapat melihat bahwa objek foo berisi dua antarmuka, dapat ditampilkan dan dapat dicetak () metode dan metode print(), Anda hanya perlu memahami bagian antarmuka, Anda dapat dengan mudah mengoperasikan objek tanpa harus peduli tentang cara kerja objek secara internal.
Kelas abstrak
Kelas abstrak tidak dapat dipakai.
Kelas abstrak, seperti kelas lainnya, memungkinkan variabel dan metode didefinisikan.
Kelas abstrak juga dapat mendefinisikan metode abstrak. Metode kelas abstrak tidak akan dieksekusi, tetapi dapat dieksekusi di kelas turunannya.
Contoh 6: Kelas abstrak
kelas abstrak foo {
dilindungi $x;
tampilan fungsi abstrak();
fungsi setX($x) {
$ini->x = $x;
}
}
kelas foo2 meluas foo {
tampilan fungsi() {
// Kode
}
}
?>
__call
Objek PHP5 memiliki metode khusus baru __call(), yang digunakan untuk memantau metode lain dalam suatu objek. Jika Anda mencoba memanggil metode yang tidak ada pada objek, metode __call akan dipanggil secara otomatis.
Contoh 7: __panggilan
kelas foo {
fungsi __panggilan($nama,$argumen) {
print("Apakah Anda menelepon saya? Nama saya $nama!");
}
} $x = foo baru();
$x->melakukanStuff();
$x->barang_mewah();
?>
Metode khusus ini dapat digunakan untuk mengimplementasikan tindakan "overloading", sehingga Anda dapat memeriksa parameter Anda dan meneruskannya dengan memanggil metode privat.
Contoh 8: Menggunakan __call untuk mengimplementasikan tindakan “kelebihan beban”.
kelas Sihir {
fungsi __panggilan($nama,$argumen) {
if($nama=='foo') {
if(is_int($argumen[0])) $ini->foo_for_int($argumen[0]);
if(is_string($argumen[0])) $ini->foo_for_string($argumen[0]);
}
} fungsi pribadi foo_for_int($x) {
print("oh dan int!");
} fungsi pribadi foo_for_string($x) {
print("oh sebuah string!");
}
} $x = Sihir baru();
$x->foo(3);
$x->foo("3");
?>
__set dan __get
Ini adalah metode yang bagus. Metode __set dan __get dapat digunakan untuk menangkap variabel dan metode yang tidak ada dalam suatu objek.
Contoh 9: __set dan __get
kelas foo {
fungsi __set($nama,$val) {
print("Halo, Anda mencoba memasukkan $val ke dalam $nama");
}
fungsi __dapatkan($nama) {
print("Hai, Anda meminta $nama");
}
}
$x = foo baru();
$x->batang = 3;
print($x->winky_winky);
?>
Indikasi tipe
Di PHP5, Anda dapat menentukan dalam metode suatu objek bahwa parameternya harus berupa turunan dari objek lain.
Contoh 10: Indikasi tipe
kelas foo {
// kode ...
}
bilah kelas {
fungsi publik process_a_foo(foo $foo) {
//Beberapa kode
}
}
$b = batang baru();
$f = foo baru();
$b->proses_a_foo($f);
?>
Seperti yang dapat dilihat, kita dapat secara eksplisit menentukan nama suatu objek sebelum parameternya, dan PHP5 akan mengenali bahwa parameter tersebut akan menjadi instance objek.
Anggota statis
Anggota statis dan metode statis disebut "metode objek (metode kelas)" dan "variabel objek (variabel kelas)" dalam terminologi pemrograman berorientasi objek.
"Metode objek" diperbolehkan untuk dipanggil sebelum suatu objek dipakai. Demikian pula, "variabel objek" dapat dikontrol secara independen sebelum suatu objek dipakai (tanpa menggunakan metode objek untuk mengontrolnya).
Contoh 11: Metode objek dan variabel objek
kalkulator kelas {
publik statis $pi = 3,14151692;
fungsi publik statis tambahkan($x,$y) {
kembalikan $x + $y;
}
}
$s = kalkulator::$pi;
$hasil = kalkulator::tambah(3,7);
print("$hasil");
?>
Penanganan pengecualian
Penanganan pengecualian diakui sebagai metode ideal untuk menangani kesalahan program. Konsep ini tersedia dalam Java dan C++. Anda dapat mencoba menggunakan "coba" dan "tangkap" untuk mengontrol kesalahan program.
Contoh 12: Penanganan pengecualian
kelas foo {
pembagian fungsi($x,$y) {
if($y==0) throw new Exception("tidak dapat membagi dengan nol");
kembalikan $x/$y;
}
}
$x = foo baru();
mencoba {
$x->bagi(3,0);
} tangkapan (Pengecualian $e) {
gema $e->getMessage();
gema "n
N";
// Beberapa tindakan bencana terjadi di sini
}
?>
Dalam contoh di atas, kami menggunakan "coba" untuk mengeksekusi pernyataan dalam tanda kurung kurawal. Ketika kesalahan terjadi, kode akan menyerahkan kesalahan tersebut ke klausa "catch" untuk diproses Menangani kesalahan pada suatu objek dapat membuat struktur kode terlihat lebih jelas, karena sekarang kita dapat menyerahkan semua informasi kesalahan ke suatu objek untuk ditangani.
Penanganan Kesalahan Khusus
Anda dapat dengan mudah mengontrol kecelakaan dalam program Anda dengan kode penanganan kesalahan khusus. Anda hanya perlu mendapatkan kelas kontrol kesalahan Anda sendiri dari kelas pengecualian. Di kelas kontrol kesalahan Anda sendiri, Anda perlu memiliki konstruktor dan metode getMessage.
Contoh 13: Penanganan kesalahan khusus
class WeirdProblem memperluas Pengecualian {
pribadi $data;
function Masalah Aneh($data) {
induk::pengecualian();
$ini->data = $data;
}
fungsi getMessage() {
return $this->data . " menyebabkan pengecualian yang aneh!";
}
}
?>
Sekarang kita dapat menggunakan "throw new WeirdProblem($foo)" untuk menangani error handler. Jika error terjadi pada blok kode "try", PHP5 akan secara otomatis menyerahkan error tersebut ke bagian "catch" untuk diproses.
Namespace
Namespace berguna untuk pengelompokan kelas atau pengelompokan fungsi. Itu dapat mengelompokkan beberapa kelas atau fungsi terkait agar mudah dipanggil nanti.
Contoh 14: Ruang Nama
ruang nama Matematika {
kelas Kompleks {
//...kode...
fungsi __konstruksi() {
cetak("hai");
}
}
} $m = Matematika baru::Kompleks();
?>
Perhatikan keadaan di mana Anda perlu menggunakan namespace. Dalam aplikasi praktis, Anda mungkin perlu mendeklarasikan dua atau lebih objek dengan nama yang sama untuk melakukan hal yang berbeda, lalu Anda dapat menempatkannya di namespace yang berbeda (tetapi antarmukanya harus sama).