Dasar Fungsi

Parameter, tipe kembalian, dan nilai default pada fungsi.

Daftar isi

Fungsi membungkus sekumpulan pernyataan menjadi satu unit yang diberi nama dan dapat dipanggil berulang kali. Topik ini membahas cara mendeklarasikan fungsi pada PHP, menerima data lewat parameter, mengirimkan hasil lewat nilai kembalian, serta menetapkan nilai default untuk argumen yang tidak disertakan. Setelah topik ini dibaca, fungsi dengan tipe parameter dan tipe kembalian dasar dapat ditulis dan dijalankan secara mandiri.

Mendeklarasikan dan memanggil fungsi#

Deklarasi fungsi diawali kata kunci function, diikuti nama fungsi, daftar parameter di dalam tanda kurung, lalu tubuh fungsi di antara tanda kurung kurawal. Nama fungsi mengikuti aturan penamaan label PHP, yaitu kombinasi huruf, angka, dan garis bawah tanpa diawali angka. Fungsi bawaan PHP menggunakan gaya snake_case, sedangkan banyak proyek aplikasi menuliskan fungsi miliknya dengan gaya camelCase. Contoh pada jalur ini mengikuti camelCase, sehingga nama seperti keFahrenheit() atau kategoriSuhu() mudah dibaca. Nama fungsi di PHP tidak peka huruf besar dan kecil, tetapi pemanggilan dengan ejaan yang persis sama dengan deklarasinya menjaga kode tetap konsisten.

Fungsi dideklarasikan sekali dan dapat dipanggil dari lokasi mana pun pada berkas yang sama, termasuk sebelum baris deklarasinya. Kemampuan ini muncul karena PHP mengumpulkan seluruh deklarasi fungsi tingkat atas sebelum program dieksekusi. Pemanggilan dilakukan dengan menuliskan nama fungsi beserta argumennya di dalam tanda kurung. Setiap argumen dipetakan ke parameter pada posisi yang sama, sehingga urutan penulisan argumen harus sesuai dengan urutan parameter pada deklarasi.

Contoh berikut mendeklarasikan dua fungsi untuk mengolah catatan suhu. Fungsi keFahrenheit() menerima satu parameter dan mengembalikan satu nilai, sedangkan kategoriSuhu() memutuskan label berdasarkan nilai yang sama. Deklarasi declare(strict_types=1) pada baris pertama mengaktifkan mode ketat, sehingga argumen yang diteruskan harus sesuai dengan tipe yang dideklarasikan tanpa konversi otomatis.

php konversi-suhu.php
<?php
declare(strict_types=1);

function keFahrenheit(float $celsius): float
{
    return $celsius * 9 / 5 + 32;
}

function kategoriSuhu(float $celsius): string
{
    if ($celsius <= 0) {
        return 'beku';
    }
    if ($celsius >= 30) {
        return 'panas';
    }
    return 'sedang';
}

$catatanSuhu = [0.0, 25.0, 31.5, -3.0];

foreach ($catatanSuhu as $celsius) {
    echo $celsius, ' C = ', keFahrenheit($celsius), ' F (', kategoriSuhu($celsius), ")\n";
}
text Keluaran
0 C = 32 F (beku)
25 C = 77 F (sedang)
31.5 C = 88.7 F (panas)
-3 C = 26.6 F (beku)

Keluarannya memperlihatkan pemanggilan fungsi yang sama dengan masukan yang berbeda. Nilai -3.0 masuk ke kategori beku karena kondisi pertama pada kategoriSuhu() terpenuhi lebih dahulu. Pemilihan kategori dilakukan atas nilai Celsius yang menjadi masukan, sedangkan hasil konversi Fahrenheit tidak turut diperiksa.

Nilai kembalian dan void#

Pernyataan return menghentikan eksekusi fungsi dan mengirimkan satu nilai ke titik pemanggilan. Tipe yang ditulis setelah tanda : pada deklarasi menetapkan tipe nilai kembalian, sehingga fungsi yang mendeklarasikan : float wajib mengembalikan nilai bertipe float. Sebuah fungsi boleh memuat lebih dari satu pernyataan return yang dipilih melalui percabangan, tetapi hanya satu yang dieksekusi karena eksekusi berhenti pada return pertama yang tercapai.

Tipe kembalian void menyatakan bahwa fungsi tidak mengembalikan nilai apa pun. Fungsi seperti ini digunakan untuk aksi, misalnya mencetak keluaran atau menulis log. Fungsi tanpa deklarasi tipe kembalian yang berakhir tanpa return mengembalikan null, sehingga hasilnya tetap dapat diperiksa dengan perbandingan === null. Kebiasaan yang baik adalah mendeklarasikan tipe kembalian pada setiap fungsi baru agar statusnya, yaitu mengembalikan nilai atau tidak, dinyatakan secara eksplisit. Nilai kembalian yang tidak digunakan boleh diabaikan, tetapi hasil pemanggilan yang hilang begitu saja biasanya menjadi tanda pernyataan return yang terlupa.

Skrip berikut memuat fungsi penghitung rata-rata yang mengembalikan nilai, ditambah fungsi pelapor bertipe void yang hanya mencetak. Fungsi laporkan() memanggil rataRata() dan menggunakan hasilnya langsung pada pernyataan echo.

php rata-rata.php
<?php
declare(strict_types=1);

function rataRata(float $a, float $b): float
{
    return ($a + $b) / 2;
}

function laporkan(float $a, float $b): void
{
    echo 'Rata-rata dari ', $a, ' dan ', $b, ' = ', rataRata($a, $b), "\n";
}

laporkan(70.0, 90.0);
laporkan(55.5, 64.5);
text Keluaran
Rata-rata dari 70 dan 90 = 80
Rata-rata dari 55.5 dan 64.5 = 60

Nilai default parameter#

Parameter dapat diberi nilai default, yaitu nilai yang digunakan apabila argumen pada posisi itu tidak disertakan saat pemanggilan. Nilai default ditulis pada deklarasi setelah tanda = dan harus berupa ekspresi konstan, misalnya angka, string literal, atau array kosong. Nilainya ditetapkan saat kompilasi, bukan saat fungsi dipanggil. Cara ini mengurangi jumlah argumen yang wajib diisi sehingga pemanggilan yang paling umum menjadi lebih ringkas.

Parameter yang memiliki nilai default ditempatkan setelah parameter wajib. Sejak PHP 8.0, deklarasi parameter opsional sebelum parameter wajib dianggap deprecated dan memicu pesan peringatan, karena posisi itu menimbulkan ambiguitas tentang argumen mana yang sedang diteruskan. Nilai default juga boleh berupa null untuk parameter nullable, sehingga fungsi dapat membedakan argumen yang tidak disertakan dari argumen yang bernilai kosong.

Pada contoh berikut hanya parameter pertama yang wajib. Panggilan dengan satu argumen menggunakan kedua nilai default, panggilan dengan dua argumen mengganti nilai default pertama, dan panggilan dengan tiga argumen mengganti semuanya. Perhatikan bahwa argumen mengisi parameter berdasarkan posisi, bukan berdasarkan nama.

php format-nilai.php
<?php
declare(strict_types=1);

function formatNilai(float $nilai, int $desimal = 1, string $satuan = 'poin'): string
{
    return number_format($nilai, $desimal) . ' ' . $satuan;
}

echo formatNilai(87.5), "\n";
echo formatNilai(87.5, 2), "\n";
echo formatNilai(87.5, 2, 'persen'), "\n";
text Keluaran
87.5 poin
87.50 poin
87.50 persen

Kesalahan umum#

  • Parameter default ditempatkan sebelum parameter wajib. Deklarasi seperti function catat(string $pesan = 'kosong', int $tingkat) memicu peringatan deprecated pada PHP 8.0 ke atas. Perbaikannya dengan menukar urutan parameter sehingga parameter wajib berada di depan. Pemanggilan yang sudah ada juga ikut rusak ketika urutan parameter diubah, sehingga perubahan semacam ini diperiksa pada seluruh titik panggil.
  • Mengharapkan argumen berubah di luar fungsi. Argumen diteruskan berdasarkan nilai, sehingga pengubahan parameter di dalam tubuh fungsi tidak memengaruhi variabel di titik pemanggilan. Apabila nilai hasil pengubahan perlu dipertahankan, kembalikan nilai tersebut dengan return lalu simpan ke variabel di titik pemanggilan.
  • Lupa return pada fungsi yang mendeklarasikan tipe kembalian. Fungsi dengan deklarasi : int yang berakhir tanpa return menimbulkan TypeError saat dipanggil. Kesalahan ini baru terlihat pada saat eksekusi, bukan saat fungsi dideklarasikan, sehingga fungsi perlu diuji dengan beberapa panggilan.
  • Menuliskan spasi antara nama fungsi dan tanda kurung pemanggilan. Bentuk rataRata (70.0, 90.0) tetap sah bagi PHP, tetapi menyulitkan pencarian referensi fungsi di dalam kode. Pertahankan bentuk tanpa spasi agar nama fungsi selalu muncul sebagai satu rangkaian pada alat pencari.

Ringkasan#

  • Fungsi dideklarasikan dengan kata kunci function, dipanggil dengan nama beserta argumen pada posisi yang sesuai, dan dapat dipanggil sebelum baris deklarasinya.
  • Pernyataan return mengirimkan satu nilai ke titik pemanggilan, sedangkan tipe kembalian void menyatakan fungsi tanpa nilai kembalian.
  • Parameter default mengisi argumen yang tidak disertakan, wajib ditempatkan setelah parameter wajib, dan nilainya harus berupa ekspresi konstan.
  • declare(strict_types=1) membuat PHP memeriksa tipe argumen dan tipe kembalian tanpa konversi otomatis.

Referensi#