Penerapan Konsep Dasar OOP dalam PHP
Saya mengenal konsep OOP (Object-Oriented Programming) sekitar tahun 2009. Saat itu PHP sudah men-support konsep ini karena sudah muncul framework seperti CI (Code Igniter). Hingga posting-an ini di-publish, saya sendiri masih mempelajarinya dan salah satu caranya adalah dengan membuat Aplikasi PHP Sederhana berikut.
Step by Step
# Perancangan
Saya membuat Blog yang hanya terdiri atas entitas Post dan Comment dengan rule sebuah Post bisa memiliki relasi dengan lebih dari satu Comment dan sebuah Comment hanya boleh berelasi dengan sebuah Post. Berikut ini daftar entitas — entitas tersebut beserta atributnya,
Post: title, content
Comment: body
# Konversi Entitas menjadi Class
Setiap entitas pada tahap perancangan diubah menjadi class dan attributnya dijadikan sebagai properties milik class yang bersangkutan seperti pada listing code berikut,
<?php
class Post
{
private $title;
private $content;
public function __construct(string $title, string $content)
{
$this->title = $title;
$this->content = $content;
}
public function title() : string
{
return (string) $this->title;
}
public function content() : string
{
return (string) $this->content;
}
}
class Comment
{
private $body;
public function __construct(string $body)
{
$this->body = $body;
}
public function body() : string
{
return (string) $this->body;
}
}
Setiap property dari semua class diatas ber-visibility private agar value-nya tidak dapat diakses maupun diubah secara langsung dari luar class pemiliknya. Pengaksesan value-nya hanya dapat dilakukan melalui method getter yang ber-visibility public.
Setelah itu setiap class diatas dapat di-object-kan sebagai berikut,
...
// Instantiate the Post class
$post = new Post("Post Title", "Post content.");
// Check whether created Post is the instance of Post class
if ($post instanceof Post) {
echo "Successfully created Post object with title: {$post->title()} and content: {$post->content()}" . PHP_EOL;
}
// Instantiate the Comment class
$comment = new Comment("Comment body.");
// Check whether given Comment is the instance of Comment class
if ($comment instanceof Comment) {
echo "Successfully created Comment object with body: {$comment->body()}" . PHP_EOL;
}
Selain itu saya sisipkan pula listing code untuk mengecek apakah object yang diberikan merupakan instance dari class yang membuatnya.
# Relasi
Kodifikasi relasi saya mulai dari rule yang paling mudah yaitu sebuah Comment hanya boleh berelasi dengan sebuah Post dengan menambahkan property $post pada class Comment sebagai penampung object Post yang berelasi dengan object Comment dan sebuah method sebagai getter-nya. Saya juga mengubah kontruktor class Comment agar object-nya bisa langsung ter-bind dengan sebuah object Post begitu selesai diinstansiasi.
class Comment
{
...
private $post
public function __construct(string $body, Post $post)
{
$this->body = $body
$this->post = $post;
}
...
public function post() : Post
{
return $this->post;
}
}
Otomatis terjadi perubahan juga pada code untuk meng-create object Comment.
...
$comment = new Comment("Comment body.", $post);...
Untuk mengecek apakah object Comment yang dibuat telah berelasi dengan object Post yang diberikan saat proses instansiasinya, saya sisipkan listing code berikut,
...
// Check whether the given Comment is owned by the given Post
if ($comment->post === $post) {
echo "Comment with body: {$comment->body()} is owned by {$post->title()}" . PHP_EOL;
}
Selanjutnya saya membuat class baru bernama CommentCollector untuk meng-handle rule sebuah Post bisa memiliki relasi dengan lebih dari satu Comment,
...
class CommentCollector
{
private $comments = [];
public function add(Comment $comment)
{
$this->comments[] = $comment;
}
public function list() : array
{
return (array) $this->comments;
}
}
...
Class CommentCollector memiliki property bertipe array, getter-nya, dan method untuk menambahkan sebuah object Comment pada property tersebut. Property ini digunakan untuk menampung setiap object Comment yang direlasikan dengan sebuah object Post.
Nah, sekarang tinggal menambahkan property $comments beserta setter dan getter-nya pada class Post. Property ini berfungsi sebagai penampung object CommentCollector.
...
class Post
{
...
private $comments;
...
public function setComments(CommentCollector $comments)
{
$this->comments = $comments;
}
...
public function comments() : CommentCollector
{
return $this->comments;
}
}
Untuk mengecek apakah sebuah object Comment sudah ditambahkan pada object CommetCollector milik sebuah object Post, saya sisipkan listing code berikut,
...
// Instantiate the CommentCollector class
$comments = new CommentCollector();
// Bind the created CommentCollector with the created Post
$post->setComments($comments);
// Add a Comment into Post's CommentCollector
$post->comments()->add($comment);
// Check whether the given Comment is already added into the given Post comments
if (in_array($comment, $post->comments()->list())) {
echo "Comment with body: {$comment->body()} is already added into {$post->title()}" . PHP_EOL;
}
Berikut ini coding-an selengkapnya,