Load Class Dinamis di PHP

Muhammad Arslan 29 September 2017

Load Class Dinamis di PHP

Pernah menggunakan web framework seperti Laravel atau Yii2? Pasti kamu bertanya - tanya bagaimana caranya sebuah class dapat dimuat secara otomatis dengan suatu URL?. Bagaimana caranya URL tersebut dipecah dan akhirnya dapat memuat class tertentu dengan action tertentu.

Bila kamu mengetahui caranya, bukan tidak mungkin kamu dapat membuat web framework sendiri sebagaimana pembuat web framework Laravel atau Yii2. Bagaimana caranya untuk melakukan load class secara dinamis di PHP.

6 Library PHP untuk Web Scraping

Sekarang kita akan coba melakukan laod class secara dinamis di PHP. Pertama buatlah sebuah folder yang akan menyimpan beberapa file di tutorial ini. Kemudian buatlah sebuah folder bernama module. Di dalamnya buatlah sebuah file dengan nama HomeController.php dan di dalamnya buat kelas HomeController seperti pada potongan kode berikut:

<?php

namespace App\Module;

class HomeController {

	function index (){
		echo "this is home/index\n";
	}

	function about (){
		echo "this is home/about\n";
	}
}

Lalu buat juga sebuah file dengan nama AuthController.php di dalam folder module dan isi dengan kode class AuthController seperti pada potongan kode berikut:

<?php

namespace App\Module;

class AuthController {

	function login (){
		echo "this is auth/login\n";
	}

	function logout (){
		echo "this is auth/logout\n";
	}
}

Kemudian di dalam class utama, kita akan gunakan sebuah class bernama ReflectionClass. Class tersebut membantu kita untuk memuat suatu class berdasarkan namanya, tepatnya string. Sehingga secara tidak langsung kita dapat memuat berbagai class dan method secara dinamis:

<?php

define("CLASS_NAMESPACE", "App\Module");

function exec_class_method($class_name, $class_method)
{
	require_once ("module/".$class_name.".php");

	if (class_exists(CLASS_NAMESPACE.'\\'.$class_name))
	{
		$ref = new ReflectionClass(CLASS_NAMESPACE.'\\'.$class_name);
		$obj = $ref->newInstanceWithoutConstructor();
		if (method_exists($obj, $class_method))
		{
			$obj->$class_method();
		}
		else
		{
			echo "Sorry action not found\n";
		}
	}
	else
	{
		echo "Sorry class not found\n";
	}
}


exec_class_method("HomeController", "index");
exec_class_method("HomeController", "about");
exec_class_method("AuthController", "login");
exec_class_method("AuthController", "logout");

Hasilnya bila kita jalankan di konsol akan muncul seperti berikut:

$ php dynamic-class-loading.php
this is home/index
this is home/about
this is auth/login
this is auth/logout

Sehingga kita tidak perlu melakukan instansiasi manual untuk kedua kelas dan keempat action diatas.