Khoerodin Developer, writer, and maker |

Developer, writer, and maker

Anonymous Class dalam OOP PHP - Ep. 16

Seperti namanya Anonymous Class adalah class anonim alias tanpa nama. Anonymous class sangat berguna jika kita mendadak membutuhkan object sederhana tanpa ingin ribet didahului pembuatan regular class seperti biasanya.

Anonymous class mulai diperkenalkan oleh PHP 7.0, kita perhatikan contoh ini, keterangan saya sisipkan dalam baris kode

class User {

  private $name;

  public function setName($givenName) {
     $this->name = $givenName;
  }

  public function getName() {
     return $this->name;
  }

}

// instansiasi
$obj = new User;

// setName() diisi oleh
// argumen yaitu
// sebuah object dari class
// tanpa nama yang dibuat
// mendadak (anonymous class)
$obj->setName(new class {

  public function show($name) {
     return "Given name: " . $name;
  }

});

// method show() berasal dari
// anonymous class dan
// jika ini dijalankan akan keluar
// Given name: Bagus
echo $obj->getName()->show("Bagus");

Saya kembali membuat kode program seperti di atas namun tidak menggunakan anonymous class

class User {

  private $name;

  public function setName($givenName) {
     $this->name = $givenName;
  }

  public function getName() {
     return $this->name;
  }

}

// dibikin class regular
// bukan sebagai anonymous class
class ShowName {

  public function show($name) {
     return "Given name: " . $name;
  }

}

// instansiasi
$show = new ShowName();
$user = new User;

// set name dari object
$user->setName($show);

// jika ini dijalankan akan sama
// hasilnya dengan contoh pertama
echo $user->getName()->show("Bagus");

Jika kode program di atas dijalankan hasilnya akan tetap sama, hanya saja pada contoh yang kedua tidak lagi menggunakan anonymous class. Lebih simple contoh yang pertama kan? 😃

Seperti class regular

Anonymous class bertindak seperti class regular:

Boleh diberi argumen, meng-extend class lain, meng-implement interface dan menggunakan trait.

class ThisClass {}
interface ThisInterface {}
trait ThisTrait {}

class User {

  private $name;

  public function setName($givenName) {
     $this->name = $givenName;
  }

  public function getName() {
     return $this->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;

  public function __construct($last_name)
  {
      $this->last_name = $last_name;
  }

  public function show($name) {
     return "Given name: " . $name . " " . $this->last_name;
  }

});

// jika dijalankan akan keluar:
// Given name: Bagus Hartono
echo $obj->getName()->show("Bagus");

Tidak boleh akses private dan protected

Ketika anonymous class dibungkus oleh class lain, walaupun dibungkus oleh class lain tetap saja anonymous class tidak diperbolehkan mengakses private dan protected method atau property yang berasal dari class yang membungkusnya.

Berikut contohnya, keterangan disisipkan dalam baris kode

class Bungkus
{
    private $warna = 'coklat ';

    protected $bahan = 'kertas ';

    public function untukWadah() {
      return "Nasi Padang";
    }

    public function diPakai() {

        // jika ingin menggunakan protected property
        // dari class Bungkus maka harus
        // meng-extend class Bungkus
        // walaupun anonymous class
        // dibungkus / berada dalam class Bungkus
        return new class($this->warna) extends Bungkus {

            private $warnanya;

            public function __construct($beriWarna)
            {
                $this->warnanya = $beriWarna;
            }

            public function makanan()
            {
                // $this->bahan berasal dari class Bungkus
                // boleh diakeses setelah meng-extend class Bungkus
                return "Bungkus " . $this->bahan . $this->warnanya . "dipakai untuk wadah " . $this->untukWadah();
            }
        };
    }
}

$obj = new Bungkus();

// jika dijalankan hasilnya:
// Bungkus kertas coklat dipakai untuk wadah Nasi Padang
echo $obj->diPakai()->makanan();

Ingat ya.. hanya seperti, bukan sama. Untuk keperluan inheritance tetap saja membutuhkan class regular yang memiliki nama.

Sebenarnya anonymous class memiliki nama, ini bisa kita buktikan dengan menjalankan sebuah function yang digunakan untuk mengambil nama class dari sebuah object: get_class(object)

echo get_class(new class {});

Ada yang ditanyakan? 😎