Dalam pemrograman berorientasi objek (Bahasa Inggris: Pemrograman berorientasi objek, singkatan: OOP), objek adalah keseluruhan yang terdiri dari informasi dan gambaran cara memproses informasi tersebut, serta merupakan abstraksi dari dunia nyata.
Di dunia nyata, benda yang kita hadapi adalah benda, misalnya komputer, televisi, sepeda, dan lain-lain.
Ada tiga ciri utama benda:
Perilaku objek: Operasi apa yang dapat diterapkan pada objek, menyalakan lampu dan mematikan lampu adalah perilaku.
Bentuk objek: bagaimana respon objek ketika metode tersebut diterapkan, warna, ukuran, tampilan.
Representasi objek: Representasi objek setara dengan kartu identitas, yang secara khusus membedakan perbedaan perilaku dan status yang sama.
Misalnya, Hewan adalah kelas abstrak. Kita dapat menentukan anjing dan domba, dan anjing dan domba adalah objek konkret. Mereka memiliki atribut warna, dapat ditulis, dapat berlari, dan keadaan perilaku lainnya.
Class - mendefinisikan karakteristik abstrak suatu benda. Pengertian kelas meliputi bentuk data dan operasi pada data tersebut.
Object - adalah turunan dari sebuah kelas.
Variabel anggota - Variabel yang didefinisikan di dalam kelas. Nilai variabel ini tidak terlihat oleh dunia luar, namun dapat diakses melalui fungsi anggota. Setelah kelas dipakai sebagai objek, variabel tersebut dapat disebut sebagai atribut objek.
Fungsi anggota - didefinisikan di dalam kelas dan dapat digunakan untuk mengakses data objek.
Inheritance - Warisan adalah mekanisme di mana subkelas secara otomatis berbagi struktur data dan metode kelas induknya. Saat mendefinisikan dan mengimplementasikan kelas, Anda bisa melakukannya berdasarkan kelas yang sudah ada, mengambil konten yang ditentukan oleh kelas yang ada sebagai konten Anda sendiri, dan menambahkan beberapa konten baru.
Parent class- Kelas yang diwarisi oleh kelas lain dapat disebut kelas induk, kelas dasar, atau kelas super.
Subclass- Kelas yang mewarisi kelas lain disebut subkelas, atau bisa juga disebut kelas turunan.
Polymorphism- Polimorfisme berarti fungsi atau metode yang sama dapat beroperasi pada beberapa jenis objek dan memperoleh hasil yang berbeda. Objek yang berbeda dapat memberikan hasil yang berbeda ketika menerima pesan yang sama. Fenomena ini disebut polimorfisme.
Overloading - Sederhananya, ini adalah situasi di mana fungsi atau metode memiliki nama yang sama tetapi daftar parameternya berbeda. Fungsi atau metode tersebut dengan nama yang sama dan parameter berbeda disebut fungsi atau metode kelebihan beban.
Abstraksi - Abstraksi mengacu pada mengabstraksi objek dengan struktur data (properti) dan perilaku (operasi) yang konsisten ke dalam kelas. Kelas adalah abstraksi yang mencerminkan properti penting yang terkait dengan suatu aplikasi sambil mengabaikan konten lain yang tidak relevan. Pembagian kelas mana pun bersifat subjektif, tetapi harus terkait dengan penerapan spesifiknya.
Encapsulation - Enkapsulasi mengacu pada pengikatan properti dan perilaku suatu objek yang ada di dunia nyata dan menempatkannya dalam unit logis.
Constructor - terutama digunakan untuk menginisialisasi objek saat membuat objek, yaitu menetapkan nilai awal ke variabel anggota objek. Itu selalu digunakan bersama dengan operator baru dalam pernyataan untuk membuat objek.
Destructor - Destructor (destruktor) Berbeda dengan konstruktor, ketika objek mengakhiri siklus hidupnya (misalnya, fungsi di mana objek tersebut berada telah dipanggil), sistem secara otomatis mengeksekusi destruktor. Destruktor sering kali digunakan untuk melakukan pekerjaan "pembersihan" (misalnya, saat membuat objek, gunakan new untuk membuka ruang memori, yang harus dilepaskan dengan delete di destructor sebelum keluar).
Pada gambar di bawah, kami telah membuat tiga objek melalui kelas Mobil: Mercedes, BMW, dan Audi.
$mercedes = Mobil baru();$bmw = Mobil baru();$audi = Mobil baru();
Format sintaks yang biasa untuk mendefinisikan kelas di PHP adalah sebagai berikut:
<?phpclass phpClass { var $var1; var $var2 = "string konstan"; fungsi myfunc ($arg1, $arg2) { [..] } [..]}?>
Analisisnya adalah sebagai berikut:
Kelas didefinisikan menggunakan kata kunci class diikuti dengan nama kelas.
Variabel dan metode bisa didefinisikan dalam sepasang kurung kurawal ({}) setelah nama kelas.
Variabel kelas dideklarasikan menggunakan var , dan variabel juga dapat diinisialisasi dengan nilai.
Definisi fungsi mirip dengan definisi fungsi PHP, tetapi fungsi hanya dapat diakses melalui kelas dan objek yang dibuatnya.
<?phpclass Situs { /* Variabel anggota*/ var $url; var $title; /* Fungsi anggota*/ function setUrl($par){ $this->url = $par; ->url .php_EOL; } fungsi setTitle($par){ $ini->judul = $par; } fungsi getTitle(){ echo $ini->judul . }}?>
Variabel $this mewakili objeknya sendiri.
PHP_EOL adalah karakter baris baru.
Setelah kelas dibuat, kita dapat menggunakan operator baru untuk membuat instance objek kelas tersebut:
$codercto = Situs baru;$taobao = Situs baru;$google = Situs baru;
Pada kode di atas, kita membuat tiga objek. Masing-masing dari ketiga objek tersebut independen. Selanjutnya, mari kita lihat cara mengakses metode anggota dan variabel anggota.
Setelah membuat instance objek, kita dapat menggunakan objek tersebut untuk memanggil metode anggota. Metode anggota objek hanya dapat beroperasi pada variabel anggota objek:
// Panggil fungsi anggota untuk menyetel judul dan URL $codercto->setTitle( "Coder Tutorial" );$taobao->setTitle( "Taobao" );$google->setTitle( "Google Search" );$codercto- > setUrl( 'www.codercto.com' );$taobao->setUrl( 'www.taobao.com' );$google->setUrl( 'www.google.com' );// Panggil fungsi anggota untuk mendapatkan judul dan URL $codercto->getTitle();$taobao->getTitle();$google->getTitle();$codercto->getUrl();$taobao-> getUrl( );$google->getUrl();
Kode lengkapnya adalah sebagai berikut:
<?php class Site { /* Variabel anggota */ var $url ; var $title ; /* Fungsi anggota */ fungsi setUrl ( $par ){ $this -> url = $par } function getUrl (){ echo $ ini -> url ; } fungsi setTitle ( $par ){ $ini - > judul = $par ; } fungsi getTitle (){ echo $ini -> judul . }} $codercto = Situs baru ; $taobao = Situs baru ; $google = Situs baru ; // Panggil fungsi anggota, tetapkan judul dan URL $ codercto - > setTitle ( " Tutorial Pembuat Kode" ) ; " ); $google -> setTitle ( "Pencarian Google" ); $codercto -> setUrl ( 'www.codercto.com' ); $taobao -> setUrl ( 'www.taobao.com' ) ; $google - > setUrl ( ' www.google.com ' ); // Memanggil fungsi anggota untuk mendapatkan judul dan URL $codercto -> getTitle (); ); $google -> getTitle (); $codercto -> getUrl (); $taobao -> getUrl (); $google -> getUrl () ;
Dengan mengeksekusi kode di atas, hasil keluarannya adalah:
Tutorial petani kode Taobao Pencarian Google www.codercto.comwww.taobao.comwww.google.com
Konstruktor adalah jenis metode khusus. Hal ini terutama digunakan untuk menginisialisasi objek saat membuat objek, yaitu, menetapkan nilai awal ke variabel anggota objek, dan menggunakannya dengan operator new
dalam pernyataan untuk membuat objek.
PHP 5 memungkinkan pengembang untuk mendefinisikan metode sebagai konstruktor di kelas, dengan sintaks berikut:
batal __konstruksi ([ campuran $args [, $... ]] )
Pada contoh di atas, kita dapat menginisialisasi variabel $url dan $title melalui konstruktor:
fungsi __konstruksi( $par1, $par2 ) { $ini->url = $par1; $ini->judul = $par2;}
Sekarang kita tidak perlu lagi memanggil metode setTitle dan setUrl:
$codercto = Situs baru('www.codercto.com', 'Tutorial Pembuat Kode');$taobao = Situs baru('www.taobao.com', 'Taobao');$google = Situs baru('www.google . com', 'Penelusuran Google');// Panggil fungsi anggota untuk mendapatkan judul dan URL $codercto->getTitle();$taobao->getTitle();$google->getTitle();$codercto->getUrl();$taobao->getUrl(); $google ->dapatkanUrl();
Destruktor (destruktor) Berbeda dengan konstruktor, ketika objek mengakhiri siklus hidupnya (misalnya, fungsi di mana objek tersebut berada telah dipanggil), sistem secara otomatis mengeksekusi destruktor.
PHP 5 memperkenalkan konsep destruktor, yang mirip dengan bahasa berorientasi objek lainnya. Sintaksnya adalah sebagai berikut:
batal __menghancurkan ( batal )
<?phpclass MyDestructableClass { fungsi __construct() { cetak "konstruktorn"; $ini->nama = "MyDestructableClass"; } fungsi __destruct() { cetak "hancurkan" $ini->nama . }$obj = baru MyDestructableClass();?>
Dengan mengeksekusi kode di atas, hasil keluarannya adalah:
Konstruktor menghancurkan MyDestructableClass
PHP menggunakan kata kunci extends untuk mewarisi suatu kelas. PHP tidak mendukung pewarisan berganda. Formatnya adalah sebagai berikut:
class Anak memperluas Induk { // Kode bagian}
Dalam contoh ini, kelas Child_Site mewarisi kelas Site dan memperluas fungsinya:
<?php // Situs_Anak memperluas Situs { var $kategori; fungsi setCate($par){ $ini->kategori = $par; } fungsi getCate(){ echo $ini->kategori }}
Jika metode yang diwarisi dari kelas induk tidak dapat memenuhi kebutuhan subkelas, maka dapat ditulis ulang. Proses ini disebut penggantian metode, juga dikenal sebagai penulisan ulang metode.
Metode getUrl dan getTitle diganti dalam contoh:
fungsi getUrl() { echo $ini->url .php_EOL; kembalikan $ini->url;} fungsi getTitle(){ echo $ini->judul .
Kontrol akses PHP ke properti atau metode dicapai dengan menambahkan kata kunci publik, dilindungi, atau pribadi di depan.
publik: Anggota kelas publik dapat diakses dari mana saja.
dilindungi: Anggota kelas yang dilindungi dapat diakses oleh dirinya sendiri dan subkelasnya serta kelas induknya.
Pribadi: Anggota kelas privat hanya dapat diakses oleh kelas di mana mereka ditentukan.
Atribut kelas harus didefinisikan sebagai publik, dilindungi, atau pribadi. Jika didefinisikan dengan var, maka dianggap publik.
<?php/** * Definisikan Kelas Saya */kelas Kelas Saya{ public $public = 'Publik'; dilindungi $dilindungi = 'Dilindungi'; pribadi $pribadi = 'Pribadi'; echo $this->protected; echo $this->private; }}$obj = new MyClass();echo $obj->public; // Baris ini dapat dieksekusi secara normal echo $obj->protected; // Baris ini akan menghasilkan kesalahan fatal echo $obj->private; // Baris ini juga akan menghasilkan kesalahan fatal $obj->printHello(); class MyClass2 extends MyClass{ // Publik dan dilindungi dapat didefinisikan ulang, tetapi pribadi tetapi tidak dilindungi $protected = 'Protected2'; function printHello() { echo $this->public; $this->protected; echo $this->private; }}$obj2 = new MyClass2();echo $obj2->public; // Baris ini dapat dieksekusi secara normal echo $obj2->private; didefinisikan $obj2->dilindungi; // Baris ini akan menghasilkan kesalahan fatal $obj2->printHello(); // Keluaran Publik, Dilindungi2 dan Tidak Terdefinisi?>
Metode dalam suatu kelas dapat didefinisikan sebagai publik, privat, atau dilindungi. Jika kata kunci ini tidak disetel, metode defaultnya adalah publik.
<?php/** * Definisikan Kelas Saya */kelas Kelas Saya{ // Deklarasikan konstruktor publik fungsi publik __construct() { } // Deklarasikan metode publik fungsi publik MyPublic() { } // Deklarasikan fungsi yang dilindungi Metode yang dilindungi MyProtected( ) { } // Deklarasikan metode privat private function MyPrivate() { } // Metode ini adalah fungsi publik Foo() { $this->MyPublic(); $this->MyProtected(); $this->MyPrivate(); }}$myclass = new MyClass;$myclass->MyPublic(); // Baris ini dapat dieksekusi secara normal $myclass->MyProtected(); Baris ini akan menghasilkan kesalahan fatal $myclass->MyPrivate(); // Baris ini akan menghasilkan kesalahan fatal $myclass->Foo(); // Public, protected, dan private semuanya dapat dieksekusi/** * Definisikan MyClass2 */class MyClass2 extends MyClass{ // Metode ini adalah fungsi publik Foo2() { $this->MyPublic(); $this->MyProtected(); menghasilkan kesalahan fatal}}$myclass2 = new MyClass2;$myclass2->MyPublic(); // Baris ini dapat dijalankan secara normal $myclass2->Foo2(); Baik yang publik maupun yang dilindungi dapat dieksekusi, tetapi yang privat tidak bisa. class Bar { public function test() { $this->testPrivate(); $this->testPublic(); :testPublicn"; } fungsi pribadi testPrivate() { echo "Bar::testPrivaten"; }}class Foo extends Bar { fungsi publik testPublic() { echo "Foo::testPublicn"; } fungsi pribadi testPrivate() { echo "Foo::testPrivaten"; }}$myFoo = new foo();$myFoo->test(); // Foo::testPublic?>
Dengan menggunakan antarmuka, Anda dapat menentukan metode mana yang harus diimplementasikan oleh suatu kelas, namun Anda tidak perlu menentukan konten spesifik dari metode ini.
Antarmuka didefinisikan melalui kata kunci antarmuka , sama seperti mendefinisikan kelas standar, tetapi semua metode yang didefinisikan di dalamnya kosong.
Semua metode yang didefinisikan dalam antarmuka harus bersifat publik. Ini adalah karakteristik antarmuka.
Untuk mengimplementasikan antarmuka, gunakan operator implementasi . Kelas harus mengimplementasikan semua metode yang ditentukan dalam antarmuka, jika tidak, kesalahan fatal akan dilaporkan. Sebuah kelas dapat mengimplementasikan banyak antarmuka. Gunakan koma untuk memisahkan nama beberapa antarmuka.
<?php// Deklarasikan antarmuka 'iTemplate' interface iTemplate{ public function setVariable($name, $var); public function getHtml($template);}// Implementasi kelas antarmuka Templat mengimplementasikan iTemplate{ private $vars = array( ) ; fungsi publik setVariable($nama, $var) { $ini->vars[$nama] = $var; } fungsi publik getHtml($template) { foreach($ini->vars sebagai $nama => $nilai) { $template = str_replace('{' . $name . '}', $value, $template);
Nilai yang tetap tidak berubah di seluruh kelas dapat didefinisikan sebagai konstanta. Tidak perlu menggunakan simbol $ saat mendefinisikan dan menggunakan konstanta.
Nilai suatu konstanta harus berupa nilai tetap dan tidak boleh berupa variabel, atribut kelas, hasil operasi matematika, atau pemanggilan fungsi.
Sejak PHP 5.3.0, kelas dapat dipanggil secara dinamis menggunakan variabel. Namun nilai variabel ini tidak boleh berupa kata kunci (seperti self, parent atau static).
<?phpclass MyClass{ const konstan = 'nilai konstan'; fungsi showConstant() { echo self::constant }}echo MyClass::constant . PHP_EOL; // Sejak 5.3.0 $kelas = baru Kelas Saya();$kelas->showConstant();echo $class::constant
Setiap kelas harus dinyatakan abstrak jika setidaknya satu metode di dalamnya dinyatakan abstrak.
Kelas yang didefinisikan sebagai abstrak tidak dapat dipakai.
Metode yang didefinisikan sebagai abstrak hanya mendeklarasikan metode pemanggilannya (parameter) dan tidak dapat menentukan implementasi fungsi spesifiknya.
Saat mewarisi kelas abstrak, subkelas harus mendefinisikan semua metode abstrak di kelas induk; selain itu, kontrol akses metode ini harus sama (atau lebih santai) seperti di kelas induk. Misalnya, jika suatu metode abstrak dinyatakan dilindungi, maka metode yang diimplementasikan dalam subkelas harus dinyatakan dilindungi atau publik, dan tidak dapat didefinisikan sebagai pribadi.
<?phpabstract class abstractClass{ // Wajib bagi subkelas untuk mendefinisikan metode ini abstract protected function getValue(); abstract protected function prefixValue($prefix); // Metode biasa (metode non-abstrak) public function printOut() { print $this - >getValue() . PHP_EOL; }}kelas ConcreteClass1 memperluas AbstrakClass{ fungsi yang dilindungi getValue() { return "ConcreteClass1"; prefixValue($prefix) { kembalikan "{$prefix}ConcreteClass1"; }}kelas ConcreteClass2 extends abstractClass{ fungsi publik getValue() { kembalikan "ConcreteClass2" fungsi publik prefixValue($prefix) { kembalikan "{$prefix}ConcreteClass2"; ; }}$kelas1 = Kelas Beton1 baru;$kelas1->printOut();gema $class1->prefixValue('FOO_') . PHP_EOL;$class2 = new ConcreteClass2;$class2->printOut();echo $class2->prefixValue('FOO_')
Dengan mengeksekusi kode di atas, hasil keluarannya adalah:
Kelas Beton1FOO_Kelas Beton1Kelas Beton2FOO_Kelas Beton2
Selain itu, metode kelas anak dapat berisi parameter opsional yang tidak ada dalam metode abstrak kelas induk.
Misalnya, jika subkelas mendefinisikan parameter opsional yang tidak disertakan dalam deklarasi metode abstrak kelas induk, subkelas tersebut masih dapat berjalan normal.
<?phpabstract class abstractClass{ // Metode abstrak kita hanya perlu mendefinisikan parameter yang diperlukan abstract protected function prefixName($name);}class ConcreteClass extends abstractClass{ // Subkelas kita dapat menentukan opsi opsional yang tidak ada dalam tanda tangan kelas induk Parameter fungsi publik prefixName($name, $separator = ".") { if ($name == "Pacman") { $prefix = "Mr"; } elseif ($name == "Pacwoman") { $prefix = "Nyonya"; } else { $prefix = ""; } return "{$prefix}{$separator} {$name}"; "), "n";echo $class->prefixName("Pacwoman"), "n";?>
Outputnya adalah:
Tuan PacmanNy. Pacwoman
Mendeklarasikan atribut atau metode kelas sebagai statis memungkinkan Anda mengaksesnya secara langsung tanpa membuat instance kelas.
Properti statis tidak dapat diakses melalui objek kelas yang telah dipakai (tetapi metode statis bisa).
Karena metode statis tidak memerlukan pemanggilan objek, variabel semu $this tidak tersedia dalam metode statis.
Properti statis tidak dapat diakses oleh objek melalui operator ->.
Sejak PHP 5.3.0, kelas dapat dipanggil secara dinamis menggunakan variabel. Namun nilai variabel ini tidak boleh berupa kata kunci self, parent atau static.
<?phpclass Foo { public static $my_static = 'foo'; fungsi publik staticValue() { return self::$my_static; }}print Foo::$my_static . >nilaistatis() .PHP_EOL;?>
Dengan mengeksekusi program di atas, hasil keluarannya adalah:
bodoh
PHP 5 menambahkan kata kunci akhir baru. Jika suatu metode di kelas induk dinyatakan final, kelas anak tidak dapat mengganti metode tersebut. Jika suatu kelas dinyatakan final, maka kelas tersebut tidak dapat diwariskan.
Kesalahan akan dilaporkan saat menjalankan kode berikut:
<?phpclass BaseClass { public function test() { echo "BaseClass::test() dipanggil" . PHP_EOL; }fungsi publik akhir moreTesting() { echo "BaseClass::moreTesting() dipanggil" BaseClass { fungsi publik moreTesting() { echo "ChildClass::moreTesting() dipanggil" . Pesan kesalahan Kesalahan fatal: Tidak dapat mengganti metode akhir BaseClass::moreTesting()?>
PHP tidak akan secara otomatis memanggil konstruktor kelas induk di konstruktor kelas anak. Untuk mengeksekusi konstruktor kelas induk, Anda perlu memanggil parent::__construct() di konstruktor kelas anak.
<?phpclass BaseClass { function __construct() { print "Metode konstruktor di kelas BaseClass" . PHP_EOL; }}class SubClass extends BaseClass { function __construct() { parent::__construct(); Metode konstruktor kelas print "Metode konstruktor di kelas SubClass" . PHP_EOL }}class OtherSubClass extends BaseClass { // Mewarisi metode konstruktor BaseClass}// Memanggil konstruktor BaseClass $obj = new BaseClass(); // Memanggil konstruktor BaseClass dan SubClass $obj = new SubClass(); // Memanggil konstruktor BaseClass $obj = new OtherSubClass();?>
Dengan mengeksekusi program di atas, hasil keluarannya adalah:
Metode konstruktor di kelas BaseClass Metode konstruktor di kelas SubClass Metode konstruktor di kelas BaseClass