File, JSON & Tanggal
Membaca/menulis file, CSV, JSON (json_encode/decode dengan JSON_THROW_ON_ERROR), DateTimeImmutable, zona waktu, dan generator.
Membaca dan menulis file
// cara cepat
$isi = file_get_contents(__DIR__ . '/data.txt'); // string, atau false jika gagal
file_put_contents(__DIR__ . '/log.txt', "baris\n", FILE_APPEND | LOCK_EX);
$baris = file(__DIR__ . '/data.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); // array baris
// aman untuk file besar: baca per baris
$h = fopen(__DIR__ . '/besar.txt', 'r');
if ($h === false) {
throw new RuntimeException('Tidak bisa membuka file');
}
while (($line = fgets($h)) !== false) {
// proses $line
}
fclose($h);
Selalu cek false dari fungsi file, gunakan __DIR__ agar path tidak bergantung folder kerja, file_exists() / is_readable() untuk memeriksa, dan LOCK_EX agar dua proses tidak saling menimpa. Jangan pernah membangun path dari input pengguna tanpa memvalidasi (bahaya path traversal ../../etc/passwd): pakai basename() dan daftar putih.
CSV
$h = fopen('produk.csv', 'r');
while (($row = fgetcsv($h)) !== false) {
[$nama, $harga] = $row;
}
fclose($h);
fputcsv($out, ['Mouse', 75000]); // menulis dengan escaping yang benar
JSON
$data = ['nama' => 'Sari', 'hobi' => ['membaca', 'coding'], 'aktif' => true];
$json = json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_THROW_ON_ERROR);
$kembali = json_decode($json, associative: true, flags: JSON_THROW_ON_ERROR);
try {
json_decode('{rusak', true, 512, JSON_THROW_ON_ERROR);
} catch (JsonException $e) {
echo 'JSON tidak valid: ' . $e->getMessage();
}
Tanpa JSON_THROW_ON_ERROR, kegagalan hanya menghasilkan null/false dan mudah terlewat. Dengan flag itu PHP melempar JsonException. Pakai json_validate() (8.3) untuk sekadar mengecek. Mengirim JSON dari skrip web:
header('Content-Type: application/json; charset=utf-8');
http_response_code(200);
echo json_encode(['ok' => true], JSON_THROW_ON_ERROR);
Objek yang ingin di-encode bisa mengimplementasikan JsonSerializable (method jsonSerialize(): mixed) untuk mengatur bentuk keluarannya.
Tanggal & waktu
Gunakan DateTimeImmutable — tidak berubah saat dimodifikasi, sehingga bebas dari bug "tanggal ikut berubah di tempat lain".
date_default_timezone_set('Asia/Jakarta');
$sekarang = new DateTimeImmutable();
$besok = $sekarang->modify('+1 day');
$tgl = new DateTimeImmutable('2026-10-16 08:30:00');
echo $tgl->format('d/m/Y H:i'); // 16/10/2026 08:30
echo $tgl->add(new DateInterval('P7D'))->format('Y-m-d'); // 2026-10-23
$selisih = (new DateTimeImmutable('2026-01-01'))->diff($tgl);
echo $selisih->days; // jumlah hari
$utc = $tgl->setTimezone(new DateTimeZone('UTC'));
Praktik baik: simpan waktu di database dalam UTC, tampilkan dalam zona pengguna. Format ISO 8601 ($d->format(DATE_ATOM)) untuk API. Hindari strtotime() dan date() bila butuh perhitungan yang rumit atau zona waktu.
Generator — hemat memori
function barisCsv(string $path): Generator
{
$h = fopen($path, 'r');
try {
while (($row = fgetcsv($h)) !== false) {
yield $row; // kirim satu baris, jeda, lanjut saat diminta
}
} finally {
fclose($h);
}
}
foreach (barisCsv('besar.csv') as $row) { /* hanya 1 baris di memori */ }
File berjuta baris bisa diproses dengan memori nyaris konstan karena yield menghasilkan nilai satu per satu.