Untuk banyak pemrogram PHP, pemrograman berorientasi objek adalah sebuah konsep yang menakutkan, penuh dengan sintaks rumit dan hambatan lain. Seperti yang dijelaskan dalam buku saya, Pro PHP and jQuery, Anda akan mempelajari konsep-konsep di belakang pemrograman berorientasi objek (OOP), sebuah gaya mengkode di mana tindakan yang terkait dikelompokkan ke dalam kelas untuk membantu menciptakan kode yang lebih kompak, yang efektif. Show
Memahami Pemrograman Berorientasi ObjekPemrograman berorientasi objek adalah gaya mengkode yang memungkinkan pengembang untuk mengelompokkan tugas-tugas serupa ke dalam kelas. Ini membantu menjaga kode mengikuti prinsip "jangan mengulangi dirimu sendiri" (DRY) dan mudah-untuk-memelihara.
Salah satu manfaat utama dari pemrograman DRY adalah bahwa, jika sepotong informasi berubah dalam program Anda, biasanya hanya satu perubahan yang diperlukan untuk memperbarui kode. Salah satu mimpi buruk bagi para pengembang adalah menjaga kode dimana data dinyatakan berulang-ulang, yang berarti setiap perubahan pada program menjadi permainan seperti Where's Waldo? yang jauh lebih membuat frustasi ketika mereka berburu untuk data dan fungsi yang digandakan. OOP menakutkan bagi banyak pengembang karena memperkenalkan sintaks baru dan, sekilas tampaknya jauh lebih kompleks daripada kode prosedural sederhana, atau inline. Namun, setelah pemeriksaan lebih dekat, OOP adalah sebenarnya sangat sederhana dan pada akhirnya pendekatan yang lebih sederhana untuk pemrograman. Pengertian Objek dan KelasSebelum Anda dapat masuk terlalu jauh ke dalam poin-poin penting dari OOP, pemahaman dasar tentang perbedaan antara objek dan kelas ini diperlukan. Bagian ini akan membahas blok bangunan kelas, kemampuan mereka yang berbeda, dan beberapa kegunaan dari mereka. Mengenali Perbedaan Antara Objek dan KelasFoto oleh Instant Jefferson dan John Wardell
Secara langsung, ada kebingungan dalam OOP: pengembang berpengalaman mulai berbicara tentang objek dan kelas, dan mereka tampaknya menjadi istilah yang dipertukarkan. Hal ini tidak terjadi, namun, meskipun perbedaan dapat menjadi sulit untuk mengingatnya di kepala Anda pada awalnya. Kelas, misalnya, adalah seperti denah sebuah rumah. Ia mendefinisikan bentuk rumah di atas kertas, dengan hubungan antara bagian-bagian yang berbeda dari rumah yang jelas dan direncanakan, meskipun rumahnya belum terwujud. Sebuah objek, kemudian, adalah seperti rumah yang sebenarnya dibangun sesuai dengan denahnya. Data yang tersimpan dalam objek seperti kayu, kawat, dan beton yang membentuk rumah: tanpa dirakit sesuai dengan denah, itu hanyalah tumpukan barang-barang. Namun, ketika itu semua dikumpulkan bersama-sama, menjadi rumah yang terorganisir, yang berguna. Kelas membentuk struktur dari data dan tindakan, dan menggunakan informasi tersebut untuk membangun objek. Lebih dari satu objek yang dapat dibangun dari kelas yang sama pada waktu yang sama, masing-masing independen dari yang lainnya. Melanjutkan dengan analogi konstruksi kami, ini mirip dengan cara seluruh bagian dapat dibangun dari denah yang sama: bahwa 150 rumah yang berbeda semua terlihat sama, namun berbeda Struktur ClassSintaks untuk membuat kelas ini cukup sederhana: mendeklarasikan kelas menggunakan kata kunci <?php class MyClass { // Class properties and methods go here } ?> Setelah membuat kelas, kelas baru dapat diturunkan dan disimpan dalam variabel menggunakan kata kunci $obj = new MyClass; Untuk melihat isi kelas, menggunakan var_dump($obj); Cobalah proses ini dengan menempatkan semua kode sebelumnya
dalam sebuah file baru yang disebut <?php class MyClass { // Class properties and methods go here } $obj = new MyClass; var_dump($obj); ?> Load halaman di browser Anda di object(MyClass)#1 (0) { } Dalam bentuk yang paling sederhana, Anda baru saja menyelesaikan skrip OOP pertama Anda. Mendefinisikan Properti KelasUntuk menambahkan data ke dalam kelas, properti, atau variabel kelas-tertentu, digunakan. Ini bekerja persis seperti variabel biasa, kecuali mereka terikat ke objek dan karena itu hanya dapat diakses menggunakan objek. Untuk menambahkan properti ke <?php class MyClass { public $prop1 = "I'm a class property!"; } $obj = new MyClass; var_dump($obj); ?> Kata kunci Untuk membaca properti ini dan output ke browser, referensikan objek dari mana yang akan dibaca dan properti yang harus dibaca: echo $obj->prop1; Karena beberapa contoh kelas dapat ada, jika objek individu tidak direferensikan, skrip akan mampu untuk menentukan objek mana untuk membaca darinya. Penggunaan panah ( Mengubah skrip di <?php class MyClass { public $prop1 = "I'm a class property!"; } $obj = new MyClass; echo $obj->prop1; // Output the property ?> Refresh browser Anda sekarang akan menghasilkan output berikut: I'm a class property! Mendefinisikan Metode KelasMethods adalah fungsi kelas-tertentu. Tindakan individu yang akan mampu dilakukan objek didefinisikan dalam kelas sebagai metode. Misalnya, untuk membuat metode yang akan mengatur dan mendapatkan nilai properti kelas <?php class MyClass { public $prop1 = "I'm a class property!"; public function setProperty($newval) { $this->prop1 = $newval; } public function getProperty() { return $this->prop1 . "<br />"; } } $obj = new MyClass; echo $obj->prop1; ?> Catatan — OOP
memungkinkan untuk mereferensikan objeknya sendiri menggunakan Untuk menggunakan metode tersebut, panggil mereka seperti fungsi biasa, tapi pertama-tama, referensikan objek yang memiliki mereka. Membaca properti dari <?php class MyClass { public $prop1 = "I'm a class property!"; public function setProperty($newval) { $this->prop1 = $newval; } public function getProperty() { return $this->prop1 . "<br />"; } } $obj = new MyClass; echo $obj->getProperty(); // Get the property value $obj->setProperty("I'm a new property value!"); // Set a new one echo $obj->getProperty(); // Read it out again to show the change ?> Reload browser Anda, dan Anda akan melihat hal berikut: I'm a class property! I'm a new property value!
<?php class MyClass { public $prop1 = "I'm a class property!"; public function setProperty($newval) { $this->prop1 = $newval; } public function getProperty() { return $this->prop1 . "<br />"; } } // Create two objects $obj = new MyClass; $obj2 = new MyClass; // Get the value of $prop1 from both objects echo $obj->getProperty(); echo $obj2->getProperty(); // Set new values for both objects $obj->setProperty("I'm a new property value!"); $obj2->setProperty("I belong to the second instance!"); // Output both objects' $prop1 value echo $obj->getProperty(); echo $obj2->getProperty(); ?> Ketika Anda me-load hasil di browser Anda, mereka terbaca sebagai berikut: I'm a class property! I'm a class property! I'm a new property value! I belong to the second instance! Seperti yang Anda lihat, OOP membuat objek-objek sebagai entitas yang terpisah, yang membuatnya memudahkan untuk pemisahan dari potongan-potongan kode yang berbeda menjadi bundel terkait yang kecil. Metode Magic dalam OOPUntuk membuat penggunaan objek-objek lebih mudah, PHP juga menyediakan sejumlah metode magic, atau metode khusus yang dipanggil pada saat tindakan umum tertentu terjadi dalam objek-objek. Ini memungkinkan pengembang untuk melakukan sejumlah tugas-tugas yang berguna dengan relatif mudah. Menggunakan Constructor dan DestructorKetika sebuah objek dibuat, hal ini sering diinginkan untuk mengatur beberapa hal secara langsung. Untuk menangani hal
ini, PHP menyediakan metode magic Untuk tujuan menggambarkan konsep constructor, tambahkan constructor untuk <?php class MyClass { public $prop1 = "I'm a class property!"; public function __construct() { echo 'The class "', __CLASS__, '" was initiated!<br />'; } public function setProperty($newval) { $this->prop1 = $newval; } public function getProperty() { return $this->prop1 . "<br />"; } } // Create a new object $obj = new MyClass; // Get the value of $prop1 echo $obj->getProperty(); // Output a message at the end of the file echo "End of file.<br />"; ?> Catatan — Reload file di browser Anda akan menghasilkan hasil sebagai berikut: The class "MyClass" was initiated! I'm a class property! End of file. Untuk memanggil fungsi ketika objek dihancurkan, disediakan metode magic Output sebuah pesan ketika objek
dihancurkan dengan mendefinisikan metode magic <?php class MyClass { public $prop1 = "I'm a class property!"; public function __construct() { echo 'The class "', __CLASS__, '" was initiated!<br />'; } public function __destruct() { echo 'The class "', __CLASS__, '" was destroyed.<br />'; } public function setProperty($newval) { $this->prop1 = $newval; } public function getProperty() { return $this->prop1 . "<br />"; } } // Create a new object $obj = new MyClass; // Get the value of $prop1 echo $obj->getProperty(); // Output a message at the end of the file echo "End of file.<br />"; ?> Setelah mendefinisikan sebuah destructor, reload file tes yang menghasilkan output berikut: The class "MyClass" was initiated! I'm a class property! End of file. The class "MyClass" was destroyed.
Untuk secara eksplisit memicu destructor, Anda dapat menghancurkan objek yang menggunakan <?php class MyClass { public $prop1 = "I'm a class property!"; public function __construct() { echo 'The class "', __CLASS__, '" was initiated!<br />'; } public function __destruct() { echo 'The class "', __CLASS__, '" was destroyed.<br />'; } public function setProperty($newval) { $this->prop1 = $newval; } public function getProperty() { return $this->prop1 . "<br />"; } } // Create a new object $obj = new MyClass; // Get the value of $prop1 echo $obj->getProperty(); // Destroy the object unset($obj); // Output a message at the end of the file echo "End of file.<br />"; ?> Sekarang hasilnya berubah menjadi berikut ketika di-load di browser Anda: The class "MyClass" was initiated! I'm a class property! The class "MyClass" was destroyed. End of file. Mengkonversi ke StringUntuk menghindari kesalahan jika skrip berupaya untuk meng-output Tanpa <?php class MyClass { public $prop1 = "I'm a class property!"; public function __construct() { echo 'The class "', __CLASS__, '" was initiated!<br />'; } public function __destruct() { echo 'The class "', __CLASS__, '" was destroyed.<br />'; } public function setProperty($newval) { $this->prop1 = $newval; } public function getProperty() { return $this->prop1 . "<br />"; } } // Create a new object $obj = new MyClass; // Output the object as a string echo $obj; // Destroy the object unset($obj); // Output a message at the end of the file echo "End of file.<br />"; ?> Hasilnya sebagai berikut: The class "MyClass" was initiated! Catchable fatal error: Object of class MyClass could not be converted to string in /Applications/XAMPP/xamppfiles/htdocs/testing/test.php on line 40 Untuk menghindari
kesalahan ini, tambahkan metode <?php class MyClass { public $prop1 = "I'm a class property!"; public function __construct() { echo 'The class "', __CLASS__, '" was initiated!<br />'; } public function __destruct() { echo 'The class "', __CLASS__, '" was destroyed.<br />'; } public function __toString() { echo "Using the toString method: "; return $this->getProperty(); } public function setProperty($newval) { $this->prop1 = $newval; } public function getProperty() { return $this->prop1 . "<br />"; } } // Create a new object $obj = new MyClass; // Output the object as a string echo $obj; // Destroy the object unset($obj); // Output a message at the end of the file echo "End of file.<br />"; ?> Dalam hal ini, mencoba untuk mengkonversi objek ke string menghasilkan panggilan ke metode The class "MyClass" was initiated! Using the toString method: I'm a class property! The class "MyClass" was destroyed. End of file. Tips — Selain metode magic yang dibahas dalam bagian ini, beberapa lainnya juga tersedia. Untuk daftar lengkap dari metode magic, lihatlah halaman manual PHP. Menggunakan Pewarisan KelasKelas dapat mewarisi metode dan properti dari kelas lain menggunakan kata kunci <?php class MyClass { public $prop1 = "I'm a class property!"; public function __construct() { echo 'The class "', __CLASS__, '" was initiated!<br />'; } public function __destruct() { echo 'The class "', __CLASS__, '" was destroyed.<br />'; } public function __toString() { echo "Using the toString method: "; return $this->getProperty(); } public function setProperty($newval) { $this->prop1 = $newval; } public function getProperty() { return $this->prop1 . "<br />"; } } class MyOtherClass extends MyClass { public function newMethod() { echo "From a new method in " . __CLASS__ . ".<br />"; } } // Create a new object $newobj = new MyOtherClass; // Output the object as a string echo $newobj->newMethod(); // Use a method from the parent class echo $newobj->getProperty(); ?> Setelah reload file tes di browser Anda, berikut adalah outputnya: The class "MyClass" was initiated! From a new method in MyOtherClass. I'm a class property! The class "MyClass" was destroyed. Menimpa Properti dan Metode yang DiwariskanUntuk mengubah perilaku properti yang sudah ada atau metode di kelas yang baru, Anda hanya dapat menimpanya dengan menyatakannya lagi di kelas yang baru: <?php class MyClass { public $prop1 = "I'm a class property!"; public function __construct() { echo 'The class "', __CLASS__, '" was initiated!<br />'; } public function __destruct() { echo 'The class "', __CLASS__, '" was destroyed.<br />'; } public function __toString() { echo "Using the toString method: "; return $this->getProperty(); } public function setProperty($newval) { $this->prop1 = $newval; } public function getProperty() { return $this->prop1 . "<br />"; } } class MyOtherClass extends MyClass { public function __construct() { echo "A new constructor in " . __CLASS__ . ".<br />"; } public function newMethod() { echo "From a new method in " . __CLASS__ . ".<br />"; } } // Create a new object $newobj = new MyOtherClass; // Output the object as a string echo $newobj->newMethod(); // Use a method from the parent class echo $newobj->getProperty(); ?> Ini perubahan output di browser: A new constructor in MyOtherClass. From a new method in MyOtherClass. I'm a class property! The class "MyClass" was destroyed. Menjaga Fungsi Metode Asli Sementara Menimpa MetodeUntuk menambah fungsionalitas baru ke metode yang diwariskan sementara menjaga metode yang asli tetap utuh, gunakan kata kunci <?php class MyClass { public $prop1 = "I'm a class property!"; public function __construct() { echo 'The class "', __CLASS__, '" was initiated!<br />'; } public function __destruct() { echo 'The class "', __CLASS__, '" was destroyed.<br />'; } public function __toString() { echo "Using the toString method: "; return $this->getProperty(); } public function setProperty($newval) { $this->prop1 = $newval; } public function getProperty() { return $this->prop1 . "<br />"; } } class MyOtherClass extends MyClass { public function __construct() { parent::__construct(); // Call the parent class's constructor echo "A new constructor in " . __CLASS__ . ".<br />"; } public function newMethod() { echo "From a new method in " . __CLASS__ . ".<br />"; } } // Create a new object $newobj = new MyOtherClass; // Output the object as a string echo $newobj->newMethod(); // Use a method from the parent class echo $newobj->getProperty(); ?> Ini output hasil dari konstruktor induk dan konstruktor kelas yang baru: The class "MyClass" was initiated! A new constructor in MyOtherClass. From a new method in MyOtherClass. I'm a class property! The class "MyClass" was destroyed. Menetapkan Visibilitas dari Properti dan MetodeUntuk menambahkan kontrol atas objek, metode dan properti maka ditugaskan visibilitas. Ini mengontrol bagaimana dan dari mana properti dan metode dapat diakses. Ada tiga kata kunci visibilitas:
Catatan — Visibilitas adalah fitur baru dari PHP 5. Untuk informasi tentang kompatibilitas OOP dengan PHP 4, lihat halaman manual PHP. Properti dan Metode PublicSemua metode dan properti yang telah Anda digunakan sejauh ini adalah public. Ini berarti bahwa mereka dapat diakses di mana saja, baik di dalam kelas maupun secara eksternal. Properti dan Metode ProtectedKetika sebuah properti atau metode dinyatakan Menyatakan metode <?php class MyClass { public $prop1 = "I'm a class property!"; public function __construct() { echo 'The class "', __CLASS__, '" was initiated!<br />'; } public function __destruct() { echo 'The class "', __CLASS__, '" was destroyed.<br />'; } public function __toString() { echo "Using the toString method: "; return $this->getProperty(); } public function setProperty($newval) { $this->prop1 = $newval; } protected function getProperty() { return $this->prop1 . "<br />"; } } class MyOtherClass extends MyClass { public function __construct() { parent::__construct(); echo "A new constructor in " . __CLASS__ . ".<br />"; } public function newMethod() { echo "From a new method in " . __CLASS__ . ".<br />"; } } // Create a new object $newobj = new MyOtherClass; // Attempt to call a protected method echo $newobj->getProperty(); ?> Setelah mencoba untuk menjalankan skrip ini, error berikut muncul: The class "MyClass" was initiated! A new constructor in MyOtherClass. Fatal error: Call to protected method MyClass::getProperty() from context '' in /Applications/XAMPP/xamppfiles/htdocs/testing/test.php on line 55 Sekarang, buat metode baru dalam <?php class MyClass { public $prop1 = "I'm a class property!"; public function __construct() { echo 'The class "', __CLASS__, '" was initiated!<br />'; } public function __destruct() { echo 'The class "', __CLASS__, '" was destroyed.<br />'; } public function __toString() { echo "Using the toString method: "; return $this->getProperty(); } public function setProperty($newval) { $this->prop1 = $newval; } protected function getProperty() { return $this->prop1 . "<br />"; } } class MyOtherClass extends MyClass { public function __construct() { parent::__construct(); echo "A new constructor in " . __CLASS__ . ".<br />"; } public function newMethod() { echo "From a new method in " . __CLASS__ . ".<br />"; } public function callProtected() { return $this->getProperty(); } } // Create a new object $newobj = new MyOtherClass; // Call the protected method from within a public method echo $newobj->callProtected(); ?> Ini menghasilkan hasil yang diinginkan: The class "MyClass" was initiated! A new constructor in MyOtherClass. I'm a class property! The class "MyClass" was destroyed. Properti dan Metode PrivateProperti atau method yang dideklarasikan Untuk menunjukkan hal ini, nyatakan <?php class MyClass { public $prop1 = "I'm a class property!"; public function __construct() { echo 'The class "', __CLASS__, '" was initiated!<br />'; } public function __destruct() { echo 'The class "', __CLASS__, '" was destroyed.<br />'; } public function __toString() { echo "Using the toString method: "; return $this->getProperty(); } public function setProperty($newval) { $this->prop1 = $newval; } private function getProperty() { return $this->prop1 . "<br />"; } } class MyOtherClass extends MyClass { public function __construct() { parent::__construct(); echo "A new constructor in " . __CLASS__ . ".<br />"; } public function newMethod() { echo "From a new method in " . __CLASS__ . ".<br />"; } public function callProtected() { return $this->getProperty(); } } // Create a new object $newobj = new MyOtherClass; // Use a method from the parent class echo $newobj->callProtected(); ?> Reload browser Anda, dan muncul error berikut: The class "MyClass" was initiated! A new constructor in MyOtherClass. Fatal error: Call to private method MyClass::getProperty() from context 'MyOtherClass' in /Applications/XAMPP/xamppfiles/htdocs/testing/test.php on line 49 Properti dan Metode StaticMetode atau properti yang dinyatakan
Untuk menunjukkan hal ini, tambahkan properti static yang disebut <?php class MyClass { public $prop1 = "I'm a class property!"; public static $count = 0; public function __construct() { echo 'The class "', __CLASS__, '" was initiated!<br />'; } public function __destruct() { echo 'The class "', __CLASS__, '" was destroyed.<br />'; } public function __toString() { echo "Using the toString method: "; return $this->getProperty(); } public function setProperty($newval) { $this->prop1 = $newval; } private function getProperty() { return $this->prop1 . "<br />"; } public static function plusOne() { return "The count is " . ++self::$count . ".<br />"; } } class MyOtherClass extends MyClass { public function __construct() { parent::__construct(); echo "A new constructor in " . __CLASS__ . ".<br />"; } public function newMethod() { echo "From a new method in " . __CLASS__ . ".<br />"; } public function callProtected() { return $this->getProperty(); } } do { // Call plusOne without instantiating MyClass echo MyClass::plusOne(); } while ( MyClass::$count < 10 ); ?> Catatan — Saat mengakses properti static, tanda dolar Ketika Anda me-load script ini di browser Anda, berikut adalah outputnya: The count is 1. The count is 2. The count is 3. The count is 4. The count is 5. The count is 6. The count is 7. The count is 8. The count is 9. The count is 10. Mengomentari dengan DocBlocks
Sementara bukan merupakan bagian resmi dari OOP, mengomentari bergaya DocBlock adalah metode pendokumentasian kelas yang diterima secara luas. Selain menyediakan standar untuk Sebuah DocBlock didefinisikan dengan menggunakan blok komentar yang dimulai dengan tambahan tanda bintang: /** * This is a very basic DocBlock */ Kekuatan sebenarnya dari DocBlock adalah dilengkapi dengan kemampuan untuk menggunakan tags, yang dimulai dengan simbol ( Tag yang paling umum digunakan:
Sampel kelas yang dikomentari dengan DocBlocks mungkin terlihat seperti ini: <?php /** * A simple class * * This is the long description for this class, * which can span as many lines as needed. It is * not required, whereas the short description is * necessary. * * It can also span multiple paragraphs if the * description merits that much verbiage. * * @author Jason Lengstorf <> * @copyright 2010 Ennui Design * @license http://www.php.net/license/3_01.txt PHP License 3.01 */ class SimpleClass { /** * A public variable * * @var string stores data for the class */ public $foo; /** * Sets $foo to a new value upon class instantiation * * @param string $val a value required for the class * @return void */ public function __construct($val) { $this->foo = $val; } /** * Multiplies two integers * * Accepts a pair of integers and returns the * product of the two. * * @param int $bat a number to be multiplied * @param int $baz a number to be multiplied * @return int the product of the two parameters */ public function bar($bat, $baz) { return $bat * $baz; } } ?> Setelah anda memindai kelas sebelumnya, manfaat DocBlock yang jelas: segala sesuatu yang didefinisikan secara jelas sehingga pengembang berikutnya dapat mengambil kode dan tidak perlu harus bertanya-tanya potongan kode melakukan apa atau apa yang harus dikandungnya. Membandingkan Kode Berorientasi Objek dan ProseduralTidak ada benar-benar yang benar dan salah untuk menulis kode. Seperti yang dikatakan, bagian ini menguraikan argumen yang kuat untuk mengadopsi pendekatan berorientasi objek dalam pengembangan perangkat lunak, terutama pada aplikasi yang besar. Alasan 1: Kemudahan Pelaksanaan
Sementara itu dapat menjadi sesuatu yang membingungkan pada awalnya, OOP benar-benar menyediakan pendekatan yang lebih mudah untuk berurusan dengan data. Karena objek dapat menyimpan data secara internal, variabel tidak perlu diteruskan dari fungsi ke fungsi untuk bekerja dengan baik. Juga, karena beberapa instance dari kelas yang sama dapat berwujud secara bersamaan, berurusan dengan set data yang besar adalah jauh lebih mudah. Sebagai contoh, bayangkan Anda memiliki informasi dua orang yang sedang diproses dalam file. Mereka membutuhkan nama, pekerjaan, dan usia. Pendekatan ProseduralBerikut adalah pendekatan prosedural untuk contoh kita: <?php function changeJob($person, $newjob) { $person['job'] = $newjob; // Change the person's job return $person; } function happyBirthday($person) { ++$person['age']; // Add 1 to the person's age return $person; } $person1 = array( 'name' => 'Tom', 'job' => 'Button-Pusher', 'age' => 34 ); $person2 = array( 'name' => 'John', 'job' => 'Lever-Puller', 'age' => 41 ); // Output the starting values for the people echo "<pre>Person 1: ", print_r($person1, TRUE), "</pre>"; echo "<pre>Person 2: ", print_r($person2, TRUE), "</pre>"; // Tom got a promotion and had a birthday $person1 = changeJob($person1, 'Box-Mover'); $person1 = happyBirthday($person1); // John just had a birthday $person2 = happyBirthday($person2); // Output the new values for the people echo "<pre>Person 1: ", print_r($person1, TRUE), "</pre>"; echo "<pre>Person 2: ", print_r($person2, TRUE), "</pre>"; ?> Ketika dijalankan, kode menghasilkan output berikut: Person 1: Array ( [name] => Tom [job] => Button-Pusher [age] => 34 ) Person 2: Array ( [name] => John [job] => Lever-Puller [age] => 41 ) Person 1: Array ( [name] => Tom [job] => Box-Mover [age] => 35 ) Person 2: Array ( [name] => John [job] => Lever-Puller [age] => 42 ) Sementara kode ini tidak selalu buruk, ada banyak yang perlu diingat saat mengkode. Array dari orang yang terkena atribut harus disampaikan dan dikembalikan dari masing-masing panggilan fungsi, yang meninggalkan margin untuk kesalahan. Untuk membersihkan contoh ini, akan diinginkan untuk meninggalkan beberapa hal untuk pengembang sesedikit mungkin. Hanya informasi yang benar-benar penting untuk operasi saat ini harus perlu dilewatkan ke fungsi. Ini adalah di mana langkah-langkah OOP datang dan membantu Anda membersihkannya. Pendekatan OOPBerikut adalah pendekatan OOP untuk contoh kita: <?php class Person { private $_name; private $_job; private $_age; public function __construct($name, $job, $age) { $this->_name = $name; $this->_job = $job; $this->_age = $age; } public function changeJob($newjob) { $this->_job = $newjob; } public function happyBirthday() { ++$this->_age; } } // Create two new people $person1 = new Person("Tom", "Button-Pusher", 34); $person2 = new Person("John", "Lever Puller", 41); // Output their starting point echo "<pre>Person 1: ", print_r($person1, TRUE), "</pre>"; echo "<pre>Person 2: ", print_r($person2, TRUE), "</pre>"; // Give Tom a promotion and a birthday $person1->changeJob("Box-Mover"); $person1->happyBirthday(); // John just gets a year older $person2->happyBirthday(); // Output the ending values echo "<pre>Person 1: ", print_r($person1, TRUE), "</pre>"; echo "<pre>Person 2: ", print_r($person2, TRUE), "</pre>"; ?> Ini adalah output berikut di browser: Person 1: Person Object ( [_name:private] => Tom [_job:private] => Button-Pusher [_age:private] => 34 ) Person 2: Person Object ( [_name:private] => John [_job:private] => Lever Puller [_age:private] => 41 ) Person 1: Person Object ( [_name:private] => Tom [_job:private] => Box-Mover [_age:private] => 35 ) Person 2: Person Object ( [_name:private] => John [_job:private] => Lever Puller [_age:private] => 42 ) Ada sedikit pengaturan yang lebih banyak terlibat untuk membuat pendekatan berorientasi objek, tapi setelah kelas didefinisikan, membuat dan memodifikasi orang adalah mudah sekali; informasi orang tidak perlu diteruskan atau dikembalikan dari metode, dan hanya benar-benar informasi penting yang dilewatkan pada masing-masing metode.
Pada skala kecil, perbedaan ini mungkin tidak tampak banyak, tetapi ketika aplikasi Anda tumbuh dalam ukurannya, OOP akan secara signifikan mengurangi beban kerja Anda jika dilaksanakan dengan baik dan benar. Tips — Tidak semuanya harus berorientasi objek. Fungsi cepat yang menangani sesuatu yang kecil di satu tempat di dalam aplikasi tidak selalu harus dibungkus dalam kelas. Gunakan penilaian terbaik Anda ketika memutuskan antara pendekatan berorientasi objek dan prosedural. Alasan 2: Pengorganisasian yang Lebih BaikManfaat lain dari OOP adalah seberapa baik ini cocok untuk menjadi mudah dikemas dan dikatalog. Setiap kelas umumnya dapat disimpan dalam file terpisah sendiri, dan jika konvensi penamaan yang seragam digunakan, mengakses kelas-kelas ini sangat mudah. Misalnya Anda punya sebuah aplikasi dengan 150 kelas yang dipanggil secara dinamis melalui file kontroler pada root dari filesystem aplikasi Anda. Semua 150 kelas mengikuti konvensi penamaan Kontroler dapat melaksanakan fungsi PHP <?php function __autoload($class_name) { include_once 'inc/class.' . $class_name . '.inc.php'; } ?> Memiliki masing-masing kelas dalam file terpisah juga membuat kode lebih portabel dan lebih mudah untuk menggunakannya kembali di aplikasi baru tanpa benyak-banyak meng-copy dan mem-paste. Alasan 3: Pemeliharaan Lebih MudahKarena sifat lebih kompak dari OOP ketika dilakukan dengan benar, perubahan dalam kode yang biasanya jauh lebih mudah untuk ditemukan dan membuat dari pada implementasi kode prosedural sepanjang spaghetti. Jika serangkaian informasi tertentu memperoleh atribut baru, potongan perangkat lunak prosedural mungkin diperlukan (dalam skenario terburuk) bahwa atribut baru ditambahkan ke masing-masing fungsi yang menggunakan array. Aplikasi OOP berpotensi dapat diperbarui semudah menambahkan properti baru dan kemudian menambahkan metode yang menangani properti itu. Banyak manfaat yang dibahas dalam bagian ini merupakan hasil OOP dalam kombinasi dengan praktek-praktek pemrograman DRY. Itu pasti mungkin untuk membuat kode prosedural yang mudah-untuk-mempertahankan yang tidak menimbulkan mimpi buruk, dan sama-sama mungkin dapat membuat kode berorientasi obyek mengerikan. [Pro PHP and jQuery] akan mencoba untuk menunjukkan kombinasi dari kebiasaan mengkode yang baik dalam hubungannya dengan OOP untuk menghasilkan kode yang mudah dibaca dan dipelihara. RingkasanPada titik ini, Anda seharusnya merasa nyaman dengan gaya pemrograman berorientasi objek. Belajar OOP adalah cara yang bagus untuk meningkatkan pemrograman Anda ke tingkat berikutnya. Bila dilaksanakan dengan baik, OOP akan membantu Anda menghasilkan kode portabel yang mudah-untuk-dibaca, mudah-untuk-dijaga, yang akan menghematkan Anda (dan pengembang yang bekerja dengan Anda) jam kerja ekstra. Apakah Anda terjebak pada sesuatu yang tidak dibahas di artikel ini? Apakah Anda sudah menggunakan OOP dan memiliki beberapa tips untuk para pemula? Berbagilah di komentar! Catatan Penulis — Tutorial ini adalah kutipan dari Pro PHP and jQuery (Apress, 2010). |