Bu yazıdaki beş yardımcı işlev; hata kaydı, bayt gösterimi, geçen süre, Türkçe metinden slug üretimi ve tarih biçimlendirme içindir. Örnekler PHP 8.x sözdizimi kullanır; slug işlevi mbstring gerektirir. Bunları uygulamaya topluca kopyalamadan önce aynı adlı fonksiyon bulunmadığını kontrol edin. Örnekler eksiksiz bir hata yönetimi veya yönlendirme sistemi değildir.
Hata bilgisini ziyaretçiye dökme
Canlı sitede dosya yolu ve hata metnini ekrana basmak yerine sunucu tarafında kayıt tutun. PHP yapılandırmasında display_errors kapalı, log_errors açık olmalıdır. Aşağıdaki özel işleyici yalnız hata seviyesi ve konumu kaydeder; ham hata mesajını özellikle yazmaz.
<?php
set_error_handler(function (int $no, string $message, string $file, int $line): bool {
if (!(error_reporting() & $no)) {
return false;
}
error_log(sprintf('PHP diagnostic [%d] at %s:%d', $no, $file, $line));
return true;
});
set_error_handler bütün ölümcül hataları yakalamaz ve Throwable yakalamanın yerine geçmez. İşleyici true döndürünce varsayılan işleyici o hata için devreden çıkar; gereken kayıt ve davranış artık sizin sorumluluğunuzdadır. Logların erişimini sınırlandırın. Hata mesajı ekleyecekseniz sırları ve kişisel verileri ayıklayın.
Bayt değerini okunabilir hale getir
<?php
function boyut(int $bayt): string {
if ($bayt < 0) {
throw new InvalidArgumentException('Negative byte count');
}
$units = ['B', 'KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB'];
$value = (float) $bayt;
$i = 0;
while ($value >= 1024 && $i < count($units) - 1) {
$value /= 1024;
$i++;
}
return ($i === 0 ? (string) $bayt : number_format($value, 2, '.', ''))
. ' ' . $units[$i];
}
echo boyut(1024); // 1.00 KiB
1024 tabanlı hesap için KiB/MiB gibi ikili birimler kullanıyoruz. Eski örnekte küçük değerlerde gerçek sayı yerine sabit bir metin dönüyordu; bu sürüm 0 ve 1023 baytı da doğru gösterir. Negatif giriş reddedilir. Ölçülen değer byte olmalıdır, bit değil. Sayısal olmayan form girdilerini çağırmadan önce doğrulayın.
Geçen süreyi aşağı yuvarla
<?php
function gecenSure(int $zaman, ?int $simdi = null): string {
$fark = ($simdi ?? time()) - $zaman;
if ($fark < 0) {
throw new InvalidArgumentException('Future timestamp');
}
foreach ([86400 => 'gün', 3600 => 'saat', 60 => 'dakika', 1 => 'saniye'] as $scale => $unit) {
if ($fark >= $scale || $scale === 1) {
return intdiv($fark, $scale) . ' ' . $unit . ' önce';
}
}
}
echo gecenSure(1000, 1125); // 2 dakika önce
Fonksiyon Unix zaman damgası bekler. Deneme için ikinci parametreyi sabit verebilirsiniz; gerçek kullanımda boş bırakılınca time() kullanılır. Bu, geçen saniyelerden türetilen yaklaşık bir süredir; takvim ayı veya yılı hesaplamaz. Gelecek zaman sessizce “önce” diye gösterilmez, hata verir.
Türkçe başlıktan sınırlı bir slug üret
<?php
function seoyap(string $text): string {
$text = strtr($text, ['İ'=>'i', 'I'=>'i', 'ı'=>'i', 'Ç'=>'c', 'ç'=>'c',
'Ğ'=>'g', 'ğ'=>'g', 'Ö'=>'o', 'ö'=>'o', 'Ş'=>'s', 'ş'=>'s', 'Ü'=>'u', 'ü'=>'u']);
$text = mb_strtolower($text, 'UTF-8');
$text = trim(preg_replace('/[^a-z0-9]+/', '-', $text), '-');
if ($text === '' || strlen($text) > 160) {
throw new InvalidArgumentException('Invalid slug length');
}
return $text;
}
echo seoyap('İçerik Yönetimi'); // icerik-yonetimi
Bu işlev Türkçe karakterleri ele alır, genel amaçlı bütün alfabeleri dönüştürmez. Boş veya 160 karakterden uzun çıktı reddedilir. Aynı slug başka bir başlıktan da çıkabilir: benzersizliği veritabanında güvenceye alın. Mevcut URL'leri bu fonksiyonla topluca yeniden üretmeyin; değişen URL için yönlendirme planı gerekir.
Tarihi yalnız parçalama, doğrula
<?php
function tarihcevir(string $tarih): string {
if (!preg_match('~^\d{4}/\d{2}/\d{2}$~D', $tarih)) {
throw new InvalidArgumentException('Expected YYYY/MM/DD');
}
$date = DateTimeImmutable::createFromFormat('!Y/m/d', $tarih, new DateTimeZone('UTC'));
$errors = DateTimeImmutable::getLastErrors();
if (!$date || ($errors !== false && ($errors['warning_count'] || $errors['error_count']))
|| $date->format('Y/m/d') !== $tarih) {
throw new InvalidArgumentException('Invalid calendar date');
}
return $date->format('d-m-Y');
}
echo tarihcevir('2018/09/13'); // 13-09-2018
Bu örnek yalnız tam YYYY/MM/DD biçimini kabul eder. 2026/02/31 gibi bir değerin sonraki aya taşınmasını kabul etmez. createFromFormat uyarılarını ve getLastErrors sonucunu kontrol eder; hatasız durumda sonucun false olabilmesini de hesaba katar.
İlk denemelerinize 0 bayt, negatif sayı, gelecekteki zaman, yalnız noktalama içeren başlık ve geçersiz takvim günü ekleyin. Yardımcı işlevin doğru davranışı, beklenmeyen girdiye ne yaptığını da açıklayabilmesidir.