Namespace atau penentuan tempat file berada diperlukan untuk mencegah name collision, memiliki nama Class atau nama file yang sama pada satu aplikasi.
Misalnya kita memiliki satu file dengan banyak Class di dalamnya : Calculator{}, Mobil{}, Toyota{}, Honda{}.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
<?php class Calculator{ protected $mobil; public function __construct(Mobil $mobil){ $this->mobil = $mobil; } public function hitungJarak(){ $bbm = $this->mobil->getBbm(); $efisiensi = $this->mobil->getEfisiensi(); $jarakMaks = $bbm * $efisiensi; return $jarakMaks; } } abstract class Mobil{ protected $merk = ''; protected $bbm = 0; public function __construct(string $merk, int $bbm){ $this->merk = $merk; $this->bbm = $bbm; } public function getMerk(){ return $this->merk; } public function getBbm(){ return $this->bbm; } abstract public function getEfisiensi(); } class Toyota extends Mobil{ protected $efisiensi = 10; public function getEfisiensi(){ return $this->efisiensi; } } class Honda extends Mobil{ protected $efisiensi = 15; public function getEfisiensi(){ return $this->efisiensi; } } $toyota = new Toyota('Toyota Fortuner',10); $calculator = new Calculator($toyota); echo "Jarak Maksimum ". $toyota->getMerk() . " adalah " . $calculator->hitungJarak() . " km. <br>"; $honda = new Honda('Honda CR-V',10); $calculator = new Calculator($honda); echo "Jarak Maksimum ". $honda->getMerk() . " adalah " . $calculator->hitungJarak() . " km. <br>"; |
Kenyataannya proyek php tidak hanya dijalankan pada satu file saja, namun terpisah-pisah agar lebih mudah dimanage.
PHP memiliki standard yang dinamakan PSR (PHP Standard Recommendation). Tujuannya agar file PHP mudah dipertukarkan. Di antaranya terdapat standar PSR-4, yang menyebutkan bahwa sebuah class harus disimpan pada file-nya masing-masing, dan nama class harus sama dengan nama file. Aturan penamaan nama class dan nama file ini akan berguna saat kita nanti melakukan autoload dengan composer.
Kode di atas akan kita coba untuk ubah menjadi standard PSR.
1. Buat file Calculator.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<?php class Calculator{ protected $mobil; public function __construct(Mobil $mobil){ $this->mobil = $mobil; } public function hitungJarak(){ $bbm = $this->mobil->getBbm(); $efisiensi = $this->mobil->getEfisiensi(); $jarakMaks = $bbm * $efisiensi; return $jarakMaks; } } |
2. Buat folder Mobil dan file Mobil.php di dalamnya.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
<?php abstract class Mobil{ protected $merk = ''; protected $bbm = 0; public function __construct(string $merk, int $bbm){ $this->merk = $merk; $this->bbm = $bbm; } public function getMerk(){ return $this->merk; } public function getBbm(){ return $this->bbm; } abstract public function getEfisiensi(); } |
3. Buat file Toyota.php dan Honda.php di dalam folder Mobil.
1 2 3 4 5 6 7 8 9 |
<?php class Toyota extends Mobil{ protected $efisiensi = 10; public function getEfisiensi(){ return $this->efisiensi; } } |
1 2 3 4 5 6 7 8 9 |
<?php class Honda extends Mobil{ protected $efisiensi = 15; public function getEfisiensi(){ return $this->efisiensi; } } |
4. Buat file bernama index.php di atas folder yang berada file Calculator.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<?php require "src/Calculator.php"; require "src/Mobil/Mobil.php"; require "src/Mobil/Toyota.php"; require "src/Mobil/Honda.php"; $toyota = new Toyota('Toyota Fortuner',10); $calculator = new Calculator($toyota); echo "Jarak Maksimum ". $toyota->getMerk() . " adalah " . $calculator->hitungJarak() . " km. <br>"; $honda = new Honda('Honda CR-V',10); $calculator = new Calculator($honda); echo "Jarak Maksimum ". $honda->getMerk() . " adalah " . $calculator->hitungJarak() . " km. <br>"; |
File index.php sekarang menjadi gerbang masuk ke aplikasi.
Mendefinisikan Namespace dan Cara Pemanggilannya
Contoh di atas masih memungkinkan terjadinya name collision, karena itu kita harus memberikan namespace pada setiap Class.
Calculator.php ditambahkan namespace yang kita beri nama Dummy, menjadi :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<?php namespace Dummy; class Calculator{ protected $mobil; public function __construct(Mobil\Mobil $mobil){ $this->mobil = $mobil; } public function hitungJarak(){ $bbm = $this->mobil->getBbm(); $efisiensi = $this->mobil->getEfisiensi(); $jarakMaks = $bbm * $efisiensi; return $jarakMaks; } } |
Mobil.php, Toyota.php, Honda.php menjadi :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
<?php namespace Dummy\Mobil; abstract class Mobil{ protected $merk = ''; protected $bbm = 0; public function __construct($merk, $bbm){ $this->merk = $merk; $this->bbm = $bbm; } public function getMerk(){ return $this->merk; } public function getBbm(){ return $this->bbm; } abstract public function getEfisiensi(); } |
1 2 3 4 5 6 7 8 9 10 11 |
<?php namespace Dummy\Mobil; class Toyota extends Mobil{ protected $efisiensi = 10; public function getEfisiensi(){ return $this->efisiensi; } } |
1 2 3 4 5 6 7 8 9 10 11 |
<?php namespace Dummy\Mobil; class Honda extends Mobil{ protected $efisiensi = 15; public function getEfisiensi(){ return $this->efisiensi; } } |
Ubah index.php untuk menyertakan namespace Class :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<?php require "src/Calculator.php"; require "src/Mobil/Mobil.php"; require "src/Mobil/Toyota.php"; require "src/Mobil/Honda.php"; $toyota = new Dummy\Mobil\Toyota('Toyota Fortuner',10); $calculator = new Dummy\Calculator($toyota); echo "Jarak Maksimum ". $toyota->getMerk() . " adalah " . $calculator->hitungJarak() . " km. <br>"; $honda = new Dummy\Mobil\Honda('Honda CR-V',10); $calculator = new Dummy\Calculator($honda); echo "Jarak Maksimum ". $honda->getMerk() . " adalah " . $calculator->hitungJarak() . " km. <br>"; |
Hasilnya akan sama dengan sebelumnya.
Mengimport Namespace
Agar penulisan lebih mudah, kita bisa mengimport dulu namespace seperti ini.
Ubah Calculator.php menjadi :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<?php namespace Dummy; use Dummy\Mobil\Mobil; class Calculator{ protected $mobil; public function __construct(Mobil $mobil){ $this->mobil = $mobil; } public function hitungJarak(){ $bbm = $this->mobil->getBbm(); $efisiensi = $this->mobil->getEfisiensi(); $jarakMaks = $bbm * $efisiensi; return $jarakMaks; } } |
Ubah index.php menjadi :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<?php require "src/Calculator.php"; require "src/Mobil/Mobil.php"; require "src/Mobil/Toyota.php"; require "src/Mobil/Honda.php"; use Dummy\Calculator; use Dummy\Mobil\Toyota; use Dummy\Mobil\Honda; $toyota = new Toyota('Toyota Fortuner',10); $calculator = new Calculator($toyota); echo "Jarak Maksimum ". $toyota->getMerk() . " adalah " . $calculator->hitungJarak() . " km. <br>"; $honda = new Honda('Honda CR-V',10); $calculator = new Calculator($honda); echo "Jarak Maksimum ". $honda->getMerk() . " adalah " . $calculator->hitungJarak() . " km. <br>"; |
Membuat Alias pada Namespace
Supaya lebih mudah diingat, kita bisa menggunakan Alias sebagai pengganti namespace.
Ubah index.php menjadi :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<?php require "src/Calculator.php"; require "src/Mobil/Mobil.php"; require "src/Mobil/Toyota.php"; require "src/Mobil/Honda.php"; use Dummy\Calculator; use Dummy\Mobil\Toyota as Fortuner; use Dummy\Mobil\Honda as Crv; $toyota = new Fortuner('Toyota Fortuner',10); $calculator = new Calculator($toyota); echo "Jarak Maksimum ". $toyota->getMerk() . " adalah " . $calculator->hitungJarak() . " km. <br>"; $honda = new Crv('Honda CR-V',10); $calculator = new Calculator($honda); echo "Jarak Maksimum ". $honda->getMerk() . " adalah " . $calculator->hitungJarak() . " km. <br>"; |
Hasilnya akan sama saja.