PHP Oop Namespace Autoloading Traits Visibility
Selesai membaca dokumentasi ini?
Kembali ke rujukan utama PHP untuk melanjutkan topik lainnya.
Kembali ke rujukan utama PHP untuk melanjutkan topik lainnya.
Object-Oriented Programming (OOP) di PHP adalah pendekatan menyusun kode dengan memodelkan data dan perilaku sebagai class dan object. Alih-alih menaruh semua logika di dalam fungsi-fungsi lepas, OOP mengelompokkan state dan behavior ke dalam unit yang lebih jelas tanggung jawabnya.
Topik yang paling sering muncul di PHP OOP adalah:
public, protected, dan privateKalau dasar ini rapi, struktur project PHP jadi lebih mudah dirawat dan lebih aman dari tabrakan nama.
Pada pendekatan procedural, program dibangun dari rangkaian fungsi yang memproses data secara bertahap.
Contoh bentuk sederhananya:
<?php
function calculateTotal(array $items): float
{
$total = 0;
foreach ($items as $item) {
$total += $item['price'] * $item['qty'];
}
return $total;
}Ciri utamanya:
Pada pendekatan OOP, data dan perilaku dikumpulkan dalam class.
<?php
class Cart
{
public function __construct(private array $items = []) {}
public function total(): float
{
$total = 0;
foreach (
Ciri utamanya:
Pilih procedural kalau:
Pilih OOP kalau:
Kesalahan umum adalah memaksakan OOP untuk semua hal. Kalau satu fungsi kecil sudah cukup, tidak perlu dibuat jadi tiga class hanya demi terlihat “rapi”.
Class adalah template. Di dalam class biasanya ada properties dan methods.
<?php
class User
{
public function __construct(
public string $name,
private string $email,
) {}
public function displayName(): string
{
return $this->name;
Class menjelaskan:
Object adalah instance dari class.
<?php
$user = new User('Hadie', 'hadie@example.com');
echo $user->displayName();Satu class bisa dipakai untuk membuat banyak object dengan nilai state yang berbeda.
Namespace dipakai untuk mengelompokkan identifier dan mencegah tabrakan nama. Ini penting karena di PHP, class bernama sama bisa muncul di library berbeda.
<?php
namespace App\Service;
class PaymentService
{
}Pemakaian dari luar namespace:
<?php
use App\Service\PaymentService;
$service = new PaymentService();Namespace penting ketika:
App\Service, App\Controller, App\DomainKalau project masih kecil, namespace sering terasa opsional. Tapi begitu jumlah class naik, namespace jadi penyelamat dari konflik nama dan import yang tidak jelas.
Pola yang umum:
App\ControllerApp\ServiceApp\RepositoryApp\DomainApp\SupportJangan membuat namespace terlalu dalam tanpa alasan. Terlalu banyak level bisa membuat class sulit ditemukan dan hubungan antarbagian jadi kabur.
Autoloading adalah mekanisme untuk memuat class secara otomatis saat class itu dipakai, tanpa perlu require manual di setiap file.
Contoh klasik sebelum autoloading:
<?php
require 'src/User.php';
require 'src/Order.php';
require 'src/Payment.php';Dengan autoloading, PHP akan memanggil loader saat class belum ditemukan.
Autoloading penting ketika:
Tanpa autoloading, file include manual cepat jadi rapuh:
require bisa salahDi project modern, autoloading biasanya diatur lewat composer.json.
{
"autoload": {
"psr-4": {
"App\\": "src/"
}
}
}Dengan mapping ini:
App\Service\PaymentService → src/Service/PaymentService.phpApp\Controller\UserController → src/Controller/UserController.phpSetelah mengubah autoload, jalankan:
composer dump-autoloadSecara teknis kamu masih bisa tanpa autoloading, tetapi secara praktik autoloading hampir wajib saat:
Traits dipakai untuk berbagi implementasi method antarclass tanpa harus memakai inheritance penuh.
<?php
trait HasUuid
{
public function generateUuid(): string
{
return bin2hex(random_bytes(16));
}
}
class Order
{
use HasUuid;
}Traits cocok untuk hal yang:
Contoh umum:
Traits bisa jadi jebakan kalau dipakai untuk menutupi desain yang sebenarnya butuh komposisi atau interface.
Hindari traits kalau:
Kalau trait mulai terasa seperti class mini, biasanya desainnya sudah salah arah.
Visibility menentukan siapa yang boleh mengakses property atau method.
publicBisa diakses dari mana saja.
class User
{
public string $name;
}Dipakai untuk API yang memang dirancang terbuka.
protectedBisa diakses dari class itu sendiri dan subclass.
class BaseLogger
{
protected function write(string $message): void
{
// ...
}
}Cocok untuk detail internal yang masih perlu dipakai turunan.
privateHanya bisa diakses dari class itu sendiri.
class TokenService
{
private function hash(string $value): string
{
return password_hash($value, PASSWORD_DEFAULT);
}
}Cocok untuk helper internal dan detail implementasi yang tidak perlu diekspos.
Aturan praktisnya:
public hanya demi cepatVisibility yang rapi membantu object tetap konsisten.
Struktur project biasanya makin sehat kalau namespace, folder, dan autoloading dibuat selaras.
Contoh sederhana:
src/
Controller/
Service/
Repository/
Domain/
Support/Contoh pemetaan:
src/Service → namespace App\Servicesrc/Controller → namespace App\Controllersrc/Domain → namespace App\DomainKalau struktur ini konsisten, developer bisa menebak lokasi class hanya dari namanya.
Ini sering terjadi saat file lama tetap dipakai, lalu class baru ditambahkan tanpa strategi.
Akibatnya:
Kalau namespace tidak mengikuti struktur file, autoloading jadi membingungkan.
Contoh masalah:
Service, tapi namespace-nya App\Utilsrequire manualIni tanda project belum memanfaatkan autoloading dengan benar.
Risikonya:
Kalau implementasi bersama sebenarnya berbeda secara konsep, trait bukan jawaban otomatis.
Kalau semuanya public, object kehilangan kontrol atas state-nya.
Gejalanya:
Struktur yang terlalu bertingkat sering bikin nama class panjang, sulit dibaca, dan terlalu birokratis.
src/
Domain/
User.php
Repository/
UserRepository.php
Service/
UserService.php
Controller/
UserController.phpAlurnya biasanya begini:
Pola ini bukan satu-satunya jawaban, tetapi cukup stabil untuk banyak project PHP modern.
require manual tidak membesar.