Oop PHP
Oop PHP
1. Variabel
2. Kondisional
3. Perulangan
4. Array
5. Fungsi
6. dll
<?php
// diawali dengan kata class diikuti dengan nama class
// setelah nama class diikuti kurung kurawal buka
// dan diakhiri kurung kurawal tutup
class User {
// isi class nanti di sini
// isi dari class bisa property dan method
// property dan method akan dijelaskan kok
// jangan khawatir...
}
2. Property
Property sebenarnya hanyalah sebuah variable yang terletak dalam
sebuah class. Dalam literatur yang lain property disebut juga
dengan attribute. Cara penulisan property ialah dengan didahului
oleh var atau visibility
keywordyaitu public atau protected atau private dan diikuti dengan
penulisan nama variable sebagaimana biasanya dalam PHP yaitu
diawali dengan huruf atau underscore untuk karakter pertama,
kemudian boleh diikuti dengan huruf, underscore atau angka untuk
karakter kedua dan selanjutnya. Perhatikan contoh di bawah:
<?php
class User {
var $name;
public $username;
protected $brithdate;
private $address;
}
terus itu visibility keyword dalam property untuk apa? sabar….. akan
dibahas dalam artikel tersendiri kok, pokoknya baca saja artikel seri
ini urut sesuai episodenya ya
Method
Method adalah tindakan atau aksi dari suatu class. Pada artikel
sebelumnyapernah diberikan contoh class User, maka contoh
methodnya adalah tindakan dari seorang user seperti register
user, edit user, delete user, follow user dan method-method atau
tindakan-tindakan lain yang diinginkan untuk diterapkan
dalam class User.
<?php
class User {
Object
Object adalah hasil konkrit atau hasil cetakan dari sebuah class.
Sebagai contoh pada artikel sebelumnya saya telah
membuat class User maka object-nya adalah para User atau accounts,
misalnya Andre, Andi dan Bagus.
<?php
class User {
var $name;
var $username;
var $brithdate;
var $address;
function showSalam()
{
echo "<b>Salam...</b><br />Semoga sehat selalu... :)";
}
}
// set property
$Khoerodin->name = "Khoerodin";
$Khoerodin->username = "khoerodin";
$Khoerodin->brithdate = "01 Januari 2017";
$Khoerodin->address = "Ciamis, Indonesia";
// tampilkan property
echo "<b>Name:</b> " . $Khoerodin->name;
echo "<br />";
echo "<b>Username:</b> " .$Khoerodin->username;
echo "<br />";
echo "<b>Brithdate:</b> " .$Khoerodin->brithdate;
echo "<br /><br />";
// tampilkan method
echo $Khoerodin->showSalam();
echo "<br /><br />";
// set property
$Andi->name = "Andi";
$Andi->username = "andi";
$Andi->brithdate = "02 Januari 2017";
$Andi->address = "Cilacap, Indonesia";
// tampilkan property
echo "<b>Name:</b> " . $Andi->name;
echo "<br />";
echo "<b>Username:</b> " .$Andi->username;
echo "<br />";
echo "<b>Brithdate:</b> " .$Andi->brithdate;
echo "<br /><br />";
// tampilkan method
echo $Andi->showSalam();
<?php
class User {
...
<?php
...
var $name;
var $username;
var $brithdate;
var $address;
...
<?php
...
function showSalam()
{
echo "<b>Salam...</b><br />Semoga sehat selalu... :)";
}
...
Ini adalah method, seperti yang sudah saya jelaskan pada artikel
sebelum ini.
<?php
...
$Khoerodin = new User();
...
Nah ini adalah instansiasi object yaitu cara membuat object dari
sebuah classyang dalam hal ini yaitu class User.
<?php
...
$Khoerodin->name = "Khoerodin";
$Khoerodin->username = "khoerodin";
$Khoerodin->brithdate = "01 Januari 2017";
$Khoerodin->address = "Ciamis, Indonesia";
...
<?php
...
echo "<b>Name:</b> " . $Khoerodin->name;
echo "<br />";
echo "<b>Username:</b> " .$Khoerodin->username;
echo "<br />";
echo "<b>Brithdate:</b> " .$Khoerodin->brithdate;
echo "<br /><br />";
...
<?php
...
echo $Khoerodin->showSalam();
...
<?php
// sekarang buat object Andi
$Andi = new User();
// set property
$Andi->name = "Andi";
$Andi->username = "andi";
$Andi->brithdate = "02 Januari 2017";
$Andi->address = "Cilacap, Indonesia";
// tampilkan property
echo "<b>Name:</b> " . $Andi->name;
echo "<br />";
echo "<b>Username:</b> " .$Andi->username;
echo "<br />";
echo "<b>Brithdate:</b> " .$Andi->brithdate;
echo "<br /><br />";
// tampilkan method
echo $Andi->showSalam();
Name: Khoerodin
Username: khoerodin
Brithdate: 01 Januari 2017
Salam..
Semoga sehat selalu… :)
Name: Andi
Username: andi
Brithdate: 02 Januari 2017
Salam..
Semoga sehat selalu… :)
Konstanta Class
Konstanta Class atau Class Constants adalah konstanta yang
didefinisikan di dalam sebuah class.
Sebagaimana konstanta regular konstanta class juga berisi nilai tetap
dan tidak bisa diubah sepanjang program berjalan. Nilai
atau value dari konstanta harus berupa ekspresi konstan atau
ekspresi tetap yaitu bukan
merupakan variable, property atau function dan lain-lain.
Mendefinisikan Konstanta Class
Mendefinisikan Konstanta Class yaitu diawali dengan
menggunakan keyword const. Berikut contoh konstanta dalam
sebuah class
<?php
class User
{
const JK = 'Laki-laki';
}
<?php
class User
{
const JK = 'Laki-laki';
function showJK() {
echo self::JK;
}
}
<?php
class User
{
const JK = 'Laki-laki';
}
echo User::JK;
<?php
class User
{
const JK = 'Laki-laki';
}
<?php
class User
{
const JK = 'Laki-laki';
}
$classname = "User";
echo $classname::JK; // Mulai PHP 5.3.0
Tambahan
Mulai PHP 5.6.0 Konstanta Class juga dapat ber-value dari
konstanta regular.
<?php
const SATU = 1;
class User {
// Mulai PHP 5.6.0
const DUA = SATU * 2;
const TIGA = SATU + self::DUA;
const EMPAT = 'Nilai dari TIGA adalah '.self::TIGA;
}
<?php
class User {
// Mulai PHP 7.1.0
public const JK = 'Laki-laki';
private const PENDIDIKAN = 'Strata satu (S1)';
}
echo User::JK . "<br/>";
echo User::PENDIDIKAN;
Visibility
Episode 6 Diperbarui: 14 Mar 2017 3+ menit
<?php
class User {
// Menampilkan name
echo $UserGanteng->name;
<?php
class User {
3. Constant Visibility
Mulai PHP 7.1.0 konstanta atau lebih tepatnya konstanta class dapat
didefinisikan sebagai public, protected atau private. Jika konstanta
dideklarasikan tanpa menggunakan salah satu dari tiga visibility
keywordtersebut maka otomatis didefinisikan sebagai public.
<?php
class User {
function showAll()
{
echo self::PUBLIC_CONSTANT . '<br/>';
echo self::PROTECTED_CONSTANT . '<br/>';
echo self::PRIVATE_CONSTANT;
}
Class Autoloader
Suatu hal yang tidak efisien ialah ketika akan akan menggunakan
banyak class programmer membuat setiap class dalam
satu file tersendiri dan jika akan menggunakannya programmer meng-
include-kan satu per satu file classpada permulaan baris kode. Ini
bukan masalah jika hanya melakukan includesatu, dua atau lima file,
tapi jika puluhan? ratusan bahkan lebih?
Mulai PHP 5 masalah itu sudah bisa diatasi dengan mudah. Misal kita
membuat sebuah class Name dan disimpan dalam file Name.php:
<?php
class Name {
function showName($name)
{
echo 'Nama saya ' . $name . ' ';
}
Buat lagi class yaitu class Address dan disimpan dalam file Address.php.
<?php
class Address {
function showAddress($address)
{
echo 'Alamat saya ' . $address;
}
}
<?php
include 'Name.php';
$name = new Name();
$name->showName('Khoerodin');
include 'Address.php';
$address = new Address();
$address->showAddress('Ciamis');
Jika kode diatas dijalankan maka akan menghasilkan output Nama saya
Khoerodin Alamat saya Ciamis. Kode tersebut benar alias tidak ada yang
salah, namun seperti yang saya tulis di awal, bagaimana jika classnya
puluhan bahkan ratusan? tentu akan merepotkan. Kita
ubah index.php jadi seperti ini:
<?php
spl_autoload_register(function ($class) {
include $class . '.php';
});
1. Constructor
Method __construct() akan dieksekusi ketika suatu object mulai dibuat
atau diinstansiasi, yaitu ketika new jalankan.
2. Destructor
Method __destruct() akan dieksekusi ketika object dihapus atau
berhenti dijalankan.
<?php
class User {
// destructor
public function __destruct()
{
echo ' Ini dari destruktor.';
}
// constructor
public function __construct()
{
echo 'Ini dari konstruktor. ';
}
Jika kode di atas dijalankan maka outputnya Ini dari konstruktor. Nama
saya Bagus dan saya berasal dari Yogyakarta Ini dari destruktor.
<?php
class User
{
public $name;
public $username;
protected $brithdate = '03 Juni 2016';
private $address = 'Yogyakarta';
protected $gender = 'Male';
// memanggil property
// kode ini tidak error
echo $Bagus->username . '<br/>';
// Undefined property.
// karena property gender adalah protected
echo $Bagus->gender;
// memanggil method
// kode ini tidak error
$Bagus->showSalam();
$Bagus->showBio();
<?php
class User
{
// diawali dengan keyword static
// setelah visibility keyword
public static $address = 'Sumbawa';
// Undefined "Property"
// karena static property
// tidak boleh menggunakan ->
echo $Bagus->address . "<br/>";
2. Static Method
<?php
class User {
// diawali dengan keyword static
// setelah visibility keyword
public static function showBio() {
echo "Nama saya Bagus. ";
}
}
Jika sudah faham artikel saya tentang pewarisan, mari kita perhatikan
dan praktekkan kode dibawah ini:
1. Penggunaan $this
<?php
class Penulis {
Jika kita perhatikan, baik class Penulis maupun class Programmer sama-
sama memiliki method saya().
Kemudian class Programmer adalah class turunan dari class Penulis yaitu
dengan melakukan extends Penulis.
2. Penggunaan self
<?php
class Penulis {
Sebagai contoh kita akan membuat banyak level akses User dalam
sebuah website berita, ada yang sebagai Admin, Editor dan Reporter.
Dalam kasus tersebut yang pertama kita buat adalah membuat parent
class atau classinduk yang diberi nama User. Class User tersebut
nantinya akan diturunkan kepada class Admin, Editor dan Reporter. Pada
setiap child class kita tentukan harus ada method yang sama yang
harus dimiliki, misal method showName(). Jadi setiap class turunan harus
memiliki method showName(). Untuk memaksakan kehendak tersebut
maka dalam parent class (abstract class) dibuatlah abstract
method showName().
Materi mengenai abstract class dan abstract method ini akan sedikit
susah dimengerti bagi sebagian orang ketika tidak disertai contoh.
<?php
// diawali keyword abstract
abstract class User
{
// diawali keyword abstract
abstract protected function showName();
}
<?php
abstract class User
{
//
}
Jika kode program di atas tetap dijalankan maka akan keluar PHP Fatal
error: Uncaught Error: Cannot instantiate abstract class ... karena ini
adalah abstract class yang tujuannya sebagai base
class atau class acuan bukan untuk digunakan sebagai object.
3. Jika dalam sebuah class terdapat abstract method maka class tersebut harus
menjadi abstract class.
<?php
// bukan abstract class
class User
{
// tapi ini abstract method
abstract protected function showName();
}
Jika kode program di atas tetap dijalankan maka akan keluar PHP Fatal
error: Class User contains 1 abstract method and must therefore be declared
abstract or implement the remaining methods (User::showName)
karena class User bukan abstract class tetapi memiliki abstract
...
method, ini tidak diperbolehkan.
4. Abstract method hanya boleh signature
Artinya abstract method tidak boleh memiliki body, yaitu hanya berupa
deklarasi saja dan tidak memiliki isi.
<?php
abstract class User
{
// abstract method memiliki body, ditandai
// dengan disertai {}
// ini yang salah
abstract protected function showName(){
//
}
Jika kode program di atas tetap dijalankan maka akan keluar PHP Fatal
error: Abstract function User::showName() cannot contain body
... karena abstract method tidak boleh memiliki body.
5. Semua class turunan harus mengimplementasikan semua abstract method dari
parent class
<?php
abstract class User
{
abstract protected function showName();
abstract protected function showGreeting($greeting);
// regular method
public class showBio(){
retudn "this is a Bio";
}
}
Jika kode program di atas tetap dijalankan maka akan keluar PHP Fatal
error: Class Admin contains 1 abstract method and must therefore be
declared abstract or implement the remaining methods (User::showGreeting)
...karena tidak semua abstract method dari parent
class diimplementasikan, yaitu showGreeting($greeting) tidak ada
dalam class Admin.
<?php
abstract class User
{
// public
abstract public function showName();
}
Jika kode program di atas tetap dijalankan maka akan keluar PHP Fatal
error: Access level to Admin::showName() must be public (as in class User)
... karena showName() dalam child class memiliki akses level (tingkat
visibilitas) lebih tinggi dari pada showName() yang berada dalam parent
class. Urutan tingkatan akses level dari tinggi ke rendah adalah 1.
private, 2. protected 3. public.
7. Abstract class boleh memiliki property dan method regular
<?php
// abstract class
abstract class User
{
// regular property
protected $address = 'Semarang';
// abstract method
abstract protected function showName();
abstract public function showGreeting($greeting);
// regular method
public function showBio(){
return "Hi, my name is " . $this->showName() . " from " . $this-
>address;
}
}
<?php
// abstract class
abstract class User
{
// abstract method
abstract protected function showName();
// static method
public static function showHi(){
return "Hi, this is static method";
}
}
<?php
abstract class User
{
abstract protected function showName();
Jika kode program di atas tetap dijalankan maka akan keluar PHP Fatal
error: Declaration of Admin::showGreeting() must be compatible with
User::showGreeting($greeting) ... karena showGreeting() dalam child
class tidak memiliki argument
sebagaimana showGreeting() dalam parent class.
<?php
abstract class User
{
abstract protected function showName();
// memiliki required argument: $greeting
abstract public function showGreeting($greeting);
}
<?php
abstract class User
{
abstract protected function showName();
// regular method
public function showBio(){
echo "This is my Bio <br/>";
echo "My name is " . $this->showName();
}
}
outputnya:
Good morning, my name is Bagus Admin from Bandung
This is my Bio
My name is Bagus Admin
Object Interface
Object Interface adalah template untuk class dimana
semua method di dalamnya harus diimplementasikan ulang
oleh class yang memakainya ( mengimplementasikannya).
<?php
// menggunakan keyword interface
interface User
{
// isi interface nanti disini
}
<?php
interface User
{
// hanya berupa nama method dan argumen jika ada
public function username($username);
public function gender();
}
<?php
interface User
{
public function username($username);
public function gender();
}
<?php
interface User
{
public function username($username);
public function gender();
}
Jika kode di atas tetap dijalankan maka akan keluar Class Member
contains 1 abstract method and must therefore be declared abstract or
implement the remaining methods
(User::gender)... karena method gender() tidak diimplementasikan
dalam class Member.
<?php
interface User
{
public function username($username);
public function gender();
}
interface Address
{
public function street($street);
public function city($city);
}
<?php
interface User
{
// di set protected
protected function username($username);
public function gender();
}
begitu juga dengan ini, akan keluar PHP Fatal error: Access level to
Member::username() must be public (as in class User) in
...karena Member::username() tidak di set public
sebagaimana User::username()
<?php
interface User
{
public function username($username);
public function gender();
}
<?php
interface User {
public function username($username);
public function gender();
}
`
8. Boleh mengimplementasikan dua interface walaupun memiliki method sama
Mulai PHP 5.3.9 class diperbolehkan mengimplementasikan
dua interfaceyang memiliki nama method sama,
selama method memiliki signature sama.
interface UserTwo
{
// sama dengan method dalam interface UserOne
function username($username);
}
<?php
interface UserOne
{
// beda dengan method dalam interface UserTwo
function username($username);
}
interface UserTwo
{
// beda dengan method dalam interface UserOne
function username($username, $other);
}
Polymorphism
Polymorphism adalah gambaran pola dalam object-oriented
programming di mana banyak class memiliki fungsi yang berbeda
ketika menggunakan interface dan atau abstract class yang sama.
Masih bingung? ketika banyak class menggunakan interface dan
atau abstract class yang sama tapi memiliki fungsi yang berbeda-
beda itulah polymorphism.
<?php
// membuat interface Tanah
interface Tanah
{
public function hitungLuas();
}
Kita perhatikan, dalam contoh di atas terdapat dua class yaitu class
Lingkarandan class PersegiPanjang. Dua class tersebut sama-sama
turunan dari abstract class Bibit dan implementasi interface Tanah.
Walaupun dari abstract classdan interface yang sama tapi class
Lingkaran dan class PersegiPanjangmemiliki fungsi yang berbeda.
Trait
Trait adalah suatu mekanisme dimana suatu class diizinkan untuk
menggunakan kembali kode program (code reuse) yang berasal dari
hirarki yang berbeda.
Mari kita perhatikan contoh di bawah ini, saya buat tiga buah class:
<?php
class ApaKabar
{
public function apaKabar() {
return "Apa kabar?";
}
}
class SelamatPagi
{
public function selamatPagi() {
return "Selamat pagi?";
}
}
class Pesan
{
//
}
<?php
class ApaKabar
{
public function apaKabar() {
return "Apa kabar?";
}
}
<?php
// dengan keyword trait
trait ApaKabar
{
public function apaKabar() {
return "Apa kabar?";
}
}
<?php
trait ApaKabar
{
public function apaKabar() {
return "Apa kabar?";
}
}
class Pesan
{
// menggunakan use
use ApaKabar;
}
3. Multiple trait
Satu class boleh memakai lebih dari satu trait, cara memanggilnya
dipisahkan oleh koma
<?php
trait ApaKabar
{
public function apaKabar() {
return "Apa kabar?" . PHP_EOL;
}
}
trait SelamatPagi
{
public function selamatPagi() {
return "Selamat pagi?";
}
}
class Pesan
{
// menggunakan trait lebih dari satu
use ApaKabar, SelamatPagi;
}
// trait kedua
trait SelamatPagi
{
public function selamatPagi() {
return "Selamat pagi?";
}
}
// trait ketiga,
trait KabarSelamat
{
// tersusun dari kedua trait di atas
use ApaKabar, SelamatPagi;
}
class Pesan
{
// memakai trait yang
// tersusun dari trait
use KabarSelamat;
}
<?php
trait ApaKabar
{
public function apaKabar() {
return "Apa kabar?" . PHP_EOL;
}
}
1. Method turunan akan ditimpa oleh method yang berasal dari trait
2. Current class method akan menimpa method yang berasal dari trait
Ini contoh untuk aturan pertama
<?php
class ApaKabar
{
// ini akan diturunkan
public function apaKabar() {
return "Apa kabar?" . PHP_EOL;
}
}
trait SelamatPagi
{
public function selamatPagi() {
return "Selamat pagi?";
}
Class Pesan adalah turunan dari class ApaKabar yaitu dengan meng-
extends ApaKabar dan class Pesan juga menggunakan
trait SelamatPagi yaitu dengan use SelamatPagi.
<?php
trait ApaKabar
{
// apaKabar() dari trait
public function apaKabar() {
return "Apa kabar?";
}
}
class Pesan
{
use ApaKabar;
// apaKabar() dari current class
public function apaKabar() {
return "Apa kabarnya sekarang?";
}
}
6. Menangani konflik
Ketika sebuah class menggunakan trait lebih dari satu, kita bisa saja
menemukan kondisi dimana trait yang berbeda menggunakan nama
method yang sama, seperti contoh ini
<?php
trait Selamat
{
public function salam() {
return "Selamat pagi?";
}
}
trait Sapaan
{
public function salam() {
return "Assalamu'alaikum?";
}
}
class Pesan
{
use Selamat, Sapaan;
}
Ketika kode program di atas tetap dijalankan maka akan keluar fatal
error. Lalu bagaimana agar tetap bisa dijalankan?
<?php
trait Ucapan
{
public function salam() {
return "Pagi....?";
}
}
trait Selamat
{
public function salam() {
return "Assalamu'alaikum?";
}
}
trait Sapaan
{
public function salam() {
return "Selamat pagi?";
}
}
class Pesan
{
// mengeliminasi method salam()
// dari trait Ucapan dan Sapaan
// mengguanakan insteadof
use Ucapan, Selamat, Sapaan {
Selamat::salam insteadof Ucapan, Sapaan;
}
}
<?php
trait Ucapan
{
public function salam() {
return "Pagi....?";
}
}
trait Selamat
{
public function salam() {
return "Assalamu'alaikum?" . PHP_EOL;
}
}
trait Sapaan
{
public function salam() {
return "Selamat pagi?";
}
}
class Pesan
{
// membuat alias menggunakan as
// krn ingin tetap memakai salam()
// dari trait Sapaan
use Ucapan, Selamat, Sapaan {
Selamat::salam insteadof Ucapan, Sapaan;
Sapaan::salam as salamKedua;
}
}
<?php
trait Selamat {
public $satu = 1;
protected $dua = 2;
}
class Pesan {
use Selamat;
public $satu = 1; // keluar peringatan
public $dua = 2; // Fatal error
}
7. Method dalam trait boleh mengakses method dan property dalam class yang
memakainya meskipun private
<?php
trait BukaPesan
{
protected function BukaPesan() {
return $this->pesan;
}
}
class PesanPrivate
{
use BukaPesan;
private $pesan = 'Ini pesan private';
<?php
trait Selamat{
public function salam() {
echo 'Selamat pagi '. $this->getName();
}
abstract public function getName();
}
class Pesan {
private $name;
use Selamat;
public function getName() {
return $this->name;
}
public function setName($name) {
$this->name = $name;
}
}
<?php
trait Selamat {
public function malam() {
echo 'Selamat malam!';
}
}
Anonymous Class
Seperti namanya Anonymous Class adalah class anonim alias tanpa
nama. Anonymous class sangat berguna jika kita mendadak
membutuhkan objectsederhana tanpa ingin ribet didahului
pembuatan regular class seperti biasanya.
<?php
class User {
private $name;
}
// instansiasi
$obj = new User;
});
<?php
class User {
private $name;
// instansiasi
$show = new ShowName();
$user = new User;
<?php
class ThisClass {}
interface ThisInterface {}
trait ThisTrait {}
class User {
private $name;
// instansiasi
$obj = new User;
// anonymous class
// diberi argumen 'Hartono', meng-extends ThisClass
// dan meng-implement ThisInterface
$obj->setName(new class('Hartono') extends ThisClass implements
ThisInterface {
// menggunakan ThisTrait
use ThisTrait;
private $last_name;
});
// jika dijalankan akan keluar:
// Given name: Bagus Hartono
echo $obj->getName()->show("Bagus");
<?php
class Bungkus
{
private $warna = 'coklat ';
private $warnanya;
<?php
echo get_class(new class {});