Sistem Tipe PHP 8

declare(strict_types=1), union & nullable types, mixed, never, static, TypeError, dan cara membuat kode lebih aman dengan tipe.

Part 7 dari 22 ± 40 menit Gratis

Mengapa tipe penting?

PHP aslinya longgar soal tipe — dan itu enak untuk skrip kecil, tetapi berbahaya di aplikasi besar. Deklarasi tipe membuat bug tertangkap lebih awal (saat kode dijalankan, bukan saat pelanggan mengeluh), memberi dokumentasi otomatis, dan membuat editor/IDE pintar mengarahkanmu.

strict_types

Tanpa strict_types, PHP diam-diam mengonversi: hitung("5") ke parameter int tetap jalan. Dengan mode ketat, PHP melempar TypeError. Tulis ini di baris pertama setiap berkas:

<?php

declare(strict_types=1);

function kuadrat(int $x): int { return $x * $x; }

kuadrat(4);       // ok
kuadrat("4");     // TypeError: argumen harus int, string diberikan

Pengecualian: int boleh masuk ke parameter float (pelebaran aman). Mode ketat berlaku untuk pemanggilan yang ditulis di berkas itu.

Jenis tipe yang tersedia

TipeArtiSejak
int float string bool arrayScalar & array7.0 +
?stringString atau null7.1
int|stringUnion: salah satu dari beberapa tipe8.0
mixedTipe apa saja (hindari bila bisa lebih spesifik)8.0
staticKembalian: objek dari class pemanggil (method chaining)8.0
neverFungsi tidak pernah kembali (selalu throw/exit)8.1
A&BIntersection: objek harus memenuhi A dan B8.1
null, false, true mandiriBoleh dipakai sebagai tipe sendiri8.2
(A&B)|nullDNF types8.2

Contoh nyata

function cariHarga(array $daftar, string $kode): int|float|null
{
    return $daftar[$kode] ?? null;
}

function gagal(string $pesan): never
{
    throw new RuntimeException($pesan);
}

function dapatkanId(int|string $id): string
{
    return (string) $id;
}

Tipe pada properti dan konstanta

Properti class juga bisa bertipe (private int $stok;) dan PHP 8.3 menambah typed class constants (const string NAMA = 'x';). Properti bertipe yang belum diisi berstatus uninitialized: membacanya melempar Error, sehingga bug "lupa mengisi" tidak lolos.

Menangani TypeError

try {
    echo kuadrat("abc");
} catch (TypeError $e) {
    echo "Salah tipe: " . $e->getMessage();
}

Di aplikasi nyata, lebih baik memvalidasi input di batas sistem (form, API) dan mengubahnya ke tipe yang benar sekali, lalu bagian dalam aplikasi memakai tipe ketat.

Perubahan penting PHP 8 yang berkaitan dengan tipe

  • Aritmetika pada array/objek/non-numerik kini melempar TypeError (sebelumnya sekadar warning).
  • String numerik dengan spasi di akhir ("123 ") dianggap numerik.
  • Fungsi bawaan melempar ValueError untuk argumen yang nilainya tak valid.
  • Perbandingan 0 == "abc" tidak lagi true.

Praktikkan langsung, gratis

Tulis dan jalankan kode langsung di browser, dapatkan penilaian otomatis. Daftar gratis kapan saja untuk menyimpan progres dan meraih sertifikat.

Coba latihan sekarang, tanpa daftar
Bagikan: WhatsApp Facebook LinkedIn X