• Tidak ada hasil yang ditemukan

Parameter Casting

Dalam dokumen Buku Belajar Santai OOP PHP (Halaman 114-127)

Parameter Casting 107

23 echo PHP_EOL;

24 $mobil->setJumlahRoda(6);

25 echo $mobil->getJumlahRoda();

26 echo PHP_EOL;

Maka ketika kita menjalankancodediatas, yang terjadi adalaherror sebagai berikut:

Default Parameter Error

1 <?php 2

3 //filename: Persegi.php 4

5 class Persegi 6 {

7 private $sisi;

8

9 public function setSisi(array $sisi)

10 {

11 $this->sisi = $sisi;

12 }

13

14 public function getLuas()

15 {

16 $luas = array();

17 foreach ($this->sisi as $sisi) { 18 $luas[] = $sisi * $sisi;

19 }

20

21 return $luas;

22 }

23 } 24

25 $persegi = new Persegi();

26 $persegi->setSisi(array(3, 2, 4, 7));

27 $luas = $persegi->getLuas();

28 foreach ($luas as $l) { 29 echo $l.PHP_EOL;

30 }

Bilacodediatas dijalankan, makaoutput-nya sebagai berikut:

Parameter Casting 109

Casting Array

Pada code diatas, pada method setSisi, kita melakukan casting hanya tipe dataarraysaja yang boleh dimasukkan kedalammethod tersebut. Sehingga jika kita ubah code pemanggil menjadi seperti berikut:

1 <?php 2

3 //filename: Persegi.php 4

5 class Persegi 6 {

7 private $sisi;

8

9 public function setSisi(array $sisi)

10 {

11 $this->sisi = $sisi;

12 }

13

14 public function getLuas()

15 {

16 $luas = array();

17 foreach ($this->sisi as $sisi) { 18 $luas[] = $sisi * $sisi;

19 }

20

21 return $luas;

22 }

23 } 24

25 $persegi = new Persegi();

26 $persegi->setSisi(7);

27 $luas = $persegi->getLuas();

28 foreach ($luas as $l) { 29 echo $l.PHP_EOL;

30 }

Maka jika kita jalankan code diatas, yang terjadi adalah error sebagai berikut:

Error Array Casting

Selain array, kita juga dapat menjadikanclass (baik ituclass,ab- stract classmaupuninterface) untukcasting parameter. Perhatikan contoh berikut:

1 <?php 2

3 //filename: BangunRuang/BangunRuangInterface.php 4

5 namespace BangunRuang;

6

7 interface BangunRuangInterface 8 {

9 public function getLuas();

10

11 public function getKeliling();

12

13 public function getName();

14 }

Parameter Casting 111

1 <?php 2

3 //filename: BangunRuang/AbstractBangunRuang.php 4

5 namespace BangunRuang;

6

7 abstract class AbstractBangunRuang implements BangunRua\

8 ngInterface 9 {

10 protected $luas;

11

12 protected $keliling;

13

14 abstract public function countLuas();

15

16 abstract public function countKeliling();

17

18 public function getLuas()

19 {

20 $this->countLuas();

21

22 return $this->luas;

23 }

24

25 public function getKeliling()

26 {

27 $this->countKeliling();

28

29 return $this->keliling;

30 }

31 }

1 <?php 2

3 //filename: BangunRuang/Segitiga.php 4

5 namespace BangunRuang;

6

7 class Segitiga extends AbstractBangunRuang 8 {

9 private $alas;

10

11 private $tinggi;

12

13 private $sisi;

14

15 public function setAlas($alas)

16 {

17 $this->alas = (int) $alas;

18 }

19

20 public function setTinggi($tinggi)

21 {

22 $this->tinggi = (int) $tinggi;

23 }

24

25 public function setSisi($sisi)

26 {

27 $this->sisi = (int) $sisi;

28 }

29

30 public function countLuas()

31 {

32 $this->luas = (1/2) * $this->alas * $this->ting\

33 gi;

34 }

35

Parameter Casting 113

36 public function countKeliling()

37 {

38 $this->keliling = 3 * $this->sisi;

39 }

40

41 public function getName()

42 {

43 return 'SEGITIGA';

44 }

45 }

1 <?php 2

3 //filename: BangunRuang/BangunRuang.php 4

5 namespace BangunRuang;

6

7 class BangunRuang 8 {

9 private $bangunRuang;

10

11 public function add(BangunRuangInterface $bangunRua\

12 ng)

13 {

14 $this->bangunRuang[$bangunRuang->getName()] = $\

15 bangunRuang;

16 }

17

18 public function luasSegitiga($alas, $tinggi)

19 {

20 $bangun = $this->bangunRuang['SEGITIGA'];

21 $bangun->setAlas($alas);

22 $bangun->setTinggi($tinggi);

23

24 return $bangun->getLuas();

25 }

26

27 public function kelilingSegitiga($sisi)

28 {

29 $bangun = $this->bangunRuang['SEGITIGA'];

30 $bangun->setSisi($sisi);

31

32 return $bangun->getKeliling();

33 }

34 }

Bagaimana agak sedikit bingung? Agar tidak bingung, mari kita buatfilepemanggilnya sebagai berikut:

1 <?php 2

3 require __DIR__.'/BangunRuang/BangunRuangInterface.php';

4 require __DIR__.'/BangunRuang/AbstractBangunRuang.php';

5 require __DIR__.'/BangunRuang/Segitiga.php';

6 require __DIR__.'/BangunRuang/BangunRuang.php';

7

8 use BangunRuang\BangunRuangInterface;

9 use BangunRuang\AbstractBangunRuang;

10 use BangunRuang\Segitiga;

11 use BangunRuang\BangunRuang;

12

13 $segitiga = new Segitiga();

14

15 $bangunRuang = new BangunRuang();

16

17 $bangunRuang->add($segitiga);

18

19 echo $bangunRuang->luasSegitiga(3, 7);

Parameter Casting 115

20 echo PHP_EOL;

21 echo $bangunRuang->kelilingSegitiga(5);

22 echo PHP_EOL;

Seperti biasa, mari kita jalankanprogram diatas, bila Anda tidak salah menulis, seharusnyaoutput-nya sebagai berikut:

Casting Class

Pada contoh diatas, saya mencoba untuk mengaplikasikan semua yang telah kita pelajari sebelumnya mulai dariclass,abstract class hingga interface. Anda tidak perlu bingung dengan contoh yang cukup panjang diatas.

Sebenarnya inti dari code diatas adalah baris public function add(BangunRuangInterface $bangunRuang). Pada baris tersebut, kita meng-casting agar padamethodadd(),parameteryang boleh dimasukkan hanya tipe dariBangunRuang\BangunRuangInterface

sehingga hanyaclassyangimplementsdariinterfaceatau turunan dari class yang implements interface tersebut saja yang dapat dilewatkan kedalammethodadd().

Karena class Segitiga adalah child class dari AbstractBangun- Ruang dimana class tersebut implements interface BangunRuang- Interface, maka secara otomatisclassSegitigadapat dilewatkan kedalammethodadd().

Masih bingung? Mari kita buat percobaan lagi. Anggaplah kita punyaclassbaru sebagai berikut:

1 <?php 2

3 //filename: BangunRuang/Persegi.php 4

5 namespace BangunRuang;

6

7 class Persegi 8 {

9 private $sisi;

10

11 public function setSisi($sisi)

12 {

13 $this->sisi = (int) $sisi;

14 }

15

16 public function getLuas()

17 {

18 $this->luas = $this->sisi * $this->sisi;

19 }

20

21 public function getKeliling()

22 {

23 $this->keliling = 4 * $this->sisi;

24 }

25

26 public function getName()

27 {

28 return 'PERSEGI';

29 }

30 }

Kemudian kita masukkan class Persegi diatas kedalam method

add()dariclassBangunRuangsebagai berikut:

Parameter Casting 117

1 <?php 2

3 require __DIR__.'/BangunRuang/BangunRuangInterface.php';

4 require __DIR__.'/BangunRuang/AbstractBangunRuang.php';

5 require __DIR__.'/BangunRuang/Segitiga.php';

6 require __DIR__.'/BangunRuang/Persegi.php';

7 require __DIR__.'/BangunRuang/BangunRuang.php';

8

9 use BangunRuang\BangunRuangInterface;

10 use BangunRuang\AbstractBangunRuang;

11 use BangunRuang\Segitiga;

12 use BangunRuang\Persegi;

13 use BangunRuang\BangunRuang;

14

15 $segitiga = new Segitiga();

16 $persegi = new Persegi();

17

18 $bangunRuang = new BangunRuang();

19

20 $bangunRuang->add($segitiga);

21 $bangunRuang->add($persegi);

22

23 echo $bangunRuang->luasSegitiga(3, 7);

24 echo PHP_EOL;

25 echo $bangunRuang->kelilingSegitiga(5);

26 echo PHP_EOL;

Maka ketika kita jalankan, akan muncul pesanerrorsebagai berikut:

Error Class Casting

Errordiatas terjadi karena kita mencoba untuk memasukkanclass

Persegi, namun class tersebut tidak meng-implementasikan in- terface BangunRuangInterface sehingga tidak dapat dimasukan kedalammethodadd().

Sehingga bila kita ingin agar class tersebut dapat dimasukkan kedalammethodadd()maka kita cukup menambahkan bariscode berikut:

1 <?php 2

3 //filename: BangunRuang/Persegi.php 4

5 namespace BangunRuang;

6

7 class Persegi implements BangunRuangInterface 8 {

9 private $sisi;

10

11 public function setSisi($sisi)

12 {

13 $this->sisi = (int) $sisi;

14 }

15

16 public function getLuas()

17 {

18 $this->luas = $this->sisi * $this->sisi;

19 }

20

21 public function getKeliling()

22 {

23 $this->keliling = 4 * $this->sisi;

24 }

25

26 public function getName()

27 {

Parameter Casting 119

28 return 'PERSEGI';

29 }

30 }

Dan ketika kita jalankan kembali, maka pesanerror tersebut pun sudah tidak ada lagi.

Anonymous Class

I. Pengantar

Pernahkah Anda menggunakan jQuery? Jika pernah berarti Anda tidak asing dengansyntaxdibawah ini:

1 $(document).ready(function () {

2 //body

3 });

Taukah Anda nama dari bariscodeberikut:

1 function () {

2 //body

3 }

Yup, nama dari bariscode diatas adalahanonymous functionatau fungsi tanpa nama. Dalam PHP, konsep tersebut diadaptasi dan di- implementasikan lebih dalam lagi sehingga pada PHP tidak hanya adaanonymous functiontapi juga adaanonymous class.

Pada pembahasan kali ini, kita akan lebih dalam membahas tentang anonymous functiondananynomous class.

Dalam dokumen Buku Belajar Santai OOP PHP (Halaman 114-127)

Dokumen terkait