9 Ocak 2008 Çarşamba

PHP ile Include ve Require Kullanımı

Merhaba Webkolog takipçileri!

Dinamik web siteleri geliştirirken, aynı kod parçalarını farklı sayfalarda tekrar tekrar yazmak hem zaman kaybıdır hem de kodunuzu yönetmeyi zorlaştırır. Örneğin, bir web sitesindeki üstbilgi (header), altbilgi (footer) veya navigasyon menüsü gibi bileşenler neredeyse her sayfada aynıdır. İşte bu noktada PHP'nin **include** ve **require** fonksiyonları imdadımıza yetişiyor! Bu fonksiyonlar sayesinde ortak kod bloklarını ayrı dosyalarda tutup, ihtiyaç duyduğumuz her yerde kolayca çağırabiliriz. Bu makalede, PHP 5.2 ve önceki versiyonlarında bu hayati fonksiyonların nasıl çalıştığını, aralarındaki farkları ve ne zaman hangisini kullanmanız gerektiğini detaylıca inceleyeceğim. Hadi gelin, kod tekrarına veda edelim!


1. include ve require Fonksiyonlarının Temel Farkı

Hem include hem de require, belirtilen bir dosyanın içeriğini mevcut betiğe dahil etmek için kullanılır. Ancak, dosya bulunamadığında veya bir hata oluştuğunda verdikleri tepkiler farklıdır:

  • include: Dosya dahil edilemezse bir **uyarı (Warning)** verir ve betiğin geri kalan kısmı çalışmaya devam eder. Bu, sayfanın bir kısmının çalışmaması durumunda bile sitenin tamamen çökmesini istemediğiniz senaryolar için kullanışlıdır (örneğin, bir reklam kodunu dahil etmek gibi).
  • require: Dosya dahil edilemezse **ölümcül bir hata (Fatal Error)** verir ve betiğin çalışmasını durdurur. Bu, uygulamanızın çalışması için kesinlikle gerekli olan dosyalar (örneğin veritabanı bağlantı ayarları veya temel fonksiyon kütüphaneleri) için idealdir.

<?php
// Bu örnekler için 'header.php' ve 'footer.php' adında iki dosya oluşturduğunuzu varsayalım.
// header.php içeriği: <h4>Bu ana sayfanın başlığıdır.</h4>
// footer.php içeriği: <p>&copy; 2025 Webkolog. Tüm hakları saklıdır.</p>

echo "<h5>Include ile Örnek:</h5>";
// 'header.php' dosyasını dahil ediyoruz
include 'header.php'; // Eğer header.php yoksa, Warning verir ama betik devam eder.
echo "<p>Ana sayfa içeriği...</p>";
include 'footer.php'; // Eğer footer.php yoksa, Warning verir ama betik devam eder.

echo "<hr>";

echo "<h5>Require ile Örnek:</h5>";
// 'config.php' adında kritik bir dosya olduğunu varsayalım.
// config.php içeriği: <?php define('DB_HOST', 'localhost'); ?>
// Eğer 'config.php' yoksa, Fatal Error verir ve bu noktada betik durur.
// require 'config.php';
// echo "<p>Bu satır config.php bulunamazsa çalışmazdı.</p>";

echo "<p>require örneği yorum satırı yapıldı, aksi takdirde dosya yoksa bu kısım çalışmazdı.</p>";
?>

2. _once Eki: Dosyaları Yalnızca Bir Kez Dahil Etme

Bazen aynı dosyayı yanlışlıkla birden fazla kez dahil etmek isteyebiliriz. Bu durum, özellikle fonksiyon tanımları veya sınıf bildirimleri içeren dosyalarda sorunlara (örneğin "Cannot redeclare function" hataları) yol açabilir. İşte bu sorunu çözmek için include_once ve require_once kullanılır.

  • include_once: Belirtilen dosya daha önce dahil edilmemişse dahil eder. Edilmişse hiçbir şey yapmaz ve uyarı vermez.
  • require_once: Belirtilen dosya daha önce dahil edilmemişse dahil eder. Edilmişse hiçbir şey yapmaz ve ölümcül hata vermez.

<?php
// 'fonksiyonlar.php' adında bir dosya oluşturalım.
// İçeriği: <?php function merhaba() { echo "<p>Merhaba Webkolog fonksiyonu çağrıldı!</p>"; } ?>

echo "<h5>Include_once ile Fonksiyon Dahil Etme:</h5>";
include_once 'fonksiyonlar.php'; // İlk dahil etme
merhaba(); // Fonksiyonu çağır

echo "<p>Fonksiyonlar dosyasını ikinci kez include_once ile dahil etmeye çalışıyoruz:</p>";
include_once 'fonksiyonlar.php'; // Bu satırda dosya tekrar dahil edilmeyecek, hata oluşmayacak.
merhaba(); // Fonksiyonu tekrar çağır

echo "<hr>";

echo "<h5>Require_once ile Kritik Dosya Dahil Etme:</h5>";
// 'ayarlar.php' adında bir dosya oluşturalım.
// İçeriği: <?php $site_adi = "Webkolog Blog"; ?>
require_once 'ayarlar.php'; // İlk dahil etme
echo "<p>Site Adı: <b>" . $site_adi . "</b></p>";

echo "<p>Ayarlar dosyasını ikinci kez require_once ile dahil etmeye çalışıyoruz:</p>";
require_once 'ayarlar.php'; // Bu satırda dosya tekrar dahil edilmeyecek.
echo "<p>Site Adı (tekrar): <b>" . $site_adi . "</b></p>";

// Temizlik için örnek dosyaları silelim
@unlink('header.php');
@unlink('footer.php');
@unlink('fonksiyonlar.php');
@unlink('ayarlar.php');
?>

3. Dosya ve Dizin İşlemleri (Destekleyici Fonksiyonlar)

include ve require işlemleriyle birlikte, dosya ve dizinlerin varlığını kontrol etmek, onları yönetmek de sıkça karşılaştığımız ihtiyaçlardır. İşte bu noktada bazı dosya ve dizin fonksiyonları işimize yarar:


<?php
$dosya_adi = "test_dosya.txt";
$dizin_adi = "yeni_klasor";

echo "<h5>Dosya İşlemleri:</h5>";
// Dosya oluşturur: touch()
touch($dosya_adi);
echo "Dosya oluşturuldu: <b>" . $dosya_adi . "</b><br>";

// Dosyanın mevcut olup olmadığını kontrol eder: file_exists()
if (file_exists($dosya_adi)) {
    echo "<b>" . $dosya_adi . "</b> mevcut.<br>";
}

// Bir dosya olup olmadığını kontrol eder: is_file()
if (is_file($dosya_adi)) {
    echo "<b>" . $dosya_adi . "</b> gerçekten bir dosya.<br>";
}

// Dosya boyutunu verir: filesize()
echo "<b>" . $dosya_adi . "</b> boyutu: <b>" . filesize($dosya_adi) . "</b> bayt.<br>";

// Dosyayı siler: unlink()
unlink($dosya_adi);
echo "<b>" . $dosya_adi . "</b> silindi.<br>";

echo "<hr>";

echo "<h5>Dizin İşlemleri:</h5>";
// Dizin oluşturur: mkdir()
if (!is_dir($dizin_adi)) { // Dizin zaten varsa hata vermemek için kontrol edin
    mkdir($dizin_adi, 0755); // 0755 izinleri ile klasör oluştur
    echo "Dizin oluşturuldu: <b>" . $dizin_adi . "</b><br>";
}

// Bir dizin olup olmadığını kontrol eder: is_dir()
if (is_dir($dizin_adi)) {
    echo "<b>" . $dizin_adi . "</b> gerçekten bir dizin.<br>";
}

// Dizin içindeki dosyaları listeler: scandir()
// scandir() PHP 5.0.0'dan itibaren mevcuttur.
$icerik = scandir('.'); // Mevcut dizinin içeriğini listeler
echo "<p>Mevcut dizin içeriği:</p><pre>";
print_r($icerik);
echo "</pre>";

// Dizin siler: rmdir() (Dizinin boş olması gerekir)
if (is_dir($dizin_adi)) {
    rmdir($dizin_adi);
    echo "<b>" . $dizin_adi . "</b> dizini silindi.<br>";
}
?>

4. Dosya İçeriği Okuma ve Yazma (Basit ve Hızlı Yöntemler)

Bazen dosyaların tamamını tek bir işlemde okumak veya yazmak isteriz. Bu senaryolar için file_get_contents() ve file_put_contents() oldukça kullanışlıdır.


<?php
$dosya_adi = "veriler.txt";
$yazilacak_icerik = "Merhaba Webkolog!\nBu bir test metnidir.\n";

echo "<h5>file_put_contents() ile Yazma:</h5>";
// Tek seferde metin dosyası oluşturmak/yazmak için: file_put_contents()
// Eğer dosya yoksa oluşturur, varsa içeriğini baştan yazar.
file_put_contents($dosya_adi, $yazilacak_icerik);
echo "<b>" . $dosya_adi . "</b> dosyasına içerik yazıldı.<br>";

// İçeriğe ekleme yapmak için FILE_APPEND bayrağını kullanırız
file_put_contents($dosya_adi, "Yeni satır eklendi.\n", FILE_APPEND);
echo "<b>" . $dosya_adi . "</b> dosyasına yeni satır eklendi.<br>";

echo "<hr>";

echo "<h5>file_get_contents() ile Okuma:</h5>";
// Tek seferde metin dosyası okumak için: file_get_contents()
if (file_exists($dosya_adi)) {
    $okunan_icerik = file_get_contents($dosya_adi);
    echo "<b>" . $dosya_adi . "</b> içeriği:<pre>" . htmlspecialchars($okunan_icerik) . "</pre>";

    // Dosyanın belirli bir bölümünü okuma (başlangıç ve uzunluk belirterek)
    // PHP 5.1'den itibaren mevcuttur.
    $belirli_bolum = file_get_contents($dosya_adi, false, null, 8, 10); // 8. karakterden başla, 10 karakter oku
    echo "Dosyanın belirli bir bölümü (8. karakterden 10 karakter): <b>" . htmlspecialchars($belirli_bolum) . "</b><br>";

    // Harici bir URL'den kaynak kodu almak (allow_url_fopen php.ini ayarı açık olmalı)
    // $kaynak = @file_get_contents('http://www.example.com/');
    // if ($kaynak) {
    //     echo "<h5>example.com Kaynak Kodu (İlk 200 karakter):</h5><pre>";
    //     echo htmlspecialchars(substr($kaynak, 0, 200)) . "...</pre>";
    // } else {
    //     echo "<p>http://www.example.com/ kaynağından veri alınamadı.</p>";
    // }
} else {
    echo "<b>" . $dosya_adi . "</b> dosyası bulunamadı.<br>";
}

// Oluşturulan örnek dosyayı temizleyelim
@unlink($dosya_adi);
?>

5. Gelişmiş Dosya İşlemleri: fopen() ve Akış Kontrolü

Daha büyük dosyalarla çalışırken veya dosya içeriğini satır satır işlemek gibi durumlarda, fopen() ve ilgili fonksiyonlar daha fazla kontrol sağlar.


<?php
$dosya_adi = "log.txt";
$yazilacak_veri = "İlk log kaydı: " . date("Y-m-d H:i:s") . "\n";
$eklenecek_veri = "İkinci log kaydı: " . date("Y-m-d H:i:s") . "\n";

echo "<h5>fopen() ile Dosya Yazma:</h5>";
// Dosya oluşturma/yazma örnek: 'w' modu (sadece yaz, başlangıçtan başla, yoksa oluştur)
$myfile = @fopen($dosya_adi, "w"); // @ hata gizleyici, dosya açılamazsa warning verir.
if ($myfile) {
    fwrite($myfile, $yazilacak_veri); // Satır yazdırma
    fwrite($myfile, "Yeni bir satır.\n");
    fclose($myfile); // Bağlantıyı kapat
    echo "<b>" . $dosya_adi . "</b> dosyasına yazıldı (w modu).<br>";
} else {
    echo "<b>" . $dosya_adi . "</b> dosyası 'w' modunda açılamadı.<br>";
}

// 'a' modu (sadece yaz, sona ekle, yoksa oluştur)
$myfile = @fopen($dosya_adi, "a");
if ($myfile) {
    fwrite($myfile, $eklenecek_veri);
    fclose($myfile);
    echo "<b>" . $dosya_adi . "</b> dosyasına eklendi (a modu).<br>";
} else {
    echo "<b>" . $dosya_adi . "</b> dosyası 'a' modunda açılamadı.<br>";
}

echo "<hr>";

echo "<h5>fopen() ile Dosya Okuma:</h5>";
// Dosya okuma örnek: 'r' modu (sadece oku, başlangıçtan başla)
$myfile = @fopen($dosya_adi, "r");
if ($myfile) {
    echo "<b>" . $dosya_adi . "</b> içeriği:<br>";
    // Tüm satırları oku: fread()
    // echo fread($myfile, filesize($dosya_adi));

    // Tek satırı okuma: fgets()
    // echo fgets($myfile) . "<br>"; // Sadece ilk satırı okur

    // Tüm satırları alt alta okuma (satır satır): feof() ile döngü
    while(!feof($myfile)) { // Dosya sonuna gelinip gelinmediğini kontrol eder
        echo htmlspecialchars(fgets($myfile)) . "<br>"; // Tek satırı oku ve HTML etiketlerinden koru
    }
    fclose($myfile);
} else {
    echo "<b>" . $dosya_adi . "</b> dosyası 'r' modunda açılamadı. Mevcut olmayabilir.<br>";
}

// Oluşturulan örnek dosyayı temizleyelim
@unlink($dosya_adi);
?>

6. XML ve INI Dosyalarını Okuma

Yapılandırılmış verileri depolamak için XML veya INI dosyalarını kullanabiliriz. PHP, bunları kolayca ayrıştırmamızı sağlayan fonksiyonlara sahiptir.


<?php
// XML örneği için 'veriler.xml' adında bir dosya oluşturalım:
// <?xml version="1.0" encoding="UTF-8"?>
// <kitaplar>
//     <kitap>
//         <baslik>Dönüşüm</baslik>
//         <yazar>Franz Kafka</yazar>
//     </kitap>
//     <kitap>
//         <baslik>Küçük Prens</baslik>
//         <yazar>Antoine de Saint-Exupéry</yazar>
//     </kitap>
// </kitaplar>

$xml_dosya = "veriler.xml";
// Güvenli değil! curl veya benzeri yöntemler önerilir (PHP 5.2'de curl uzantısı ayrı bir konu)
// SimpleXML uzantısı PHP 5.0.0'dan itibaren mevcuttur.
// $xml = @simplexml_load_file($xml_dosya);
// if ($xml) {
//     echo "<h5>XML Dosya İçeriği:</h5>";
//     foreach ($xml->kitap as $kitap) {
//         echo "Başlık: " . $kitap->baslik . ", Yazar: " . $kitap->yazar . "<br>";
//     }
// } else {
//     echo "<p>XML dosyası yüklenemedi veya mevcut değil.</p>";
// }

echo "<p>XML okuma örneği yorum satırı yapılmıştır.</p>";

echo "<hr>";

// INI örneği için 'ayarlar.ini' adında bir dosya oluşturalım:
// [veritabanı]
// host=localhost
// user=root
// password=
// [uygulama]
// tema=varsayilan
// dil=tr
$ini_dosya = "ayarlar.ini";
// php.ini gibi yapılandırma dosyalarını okumak için
$ini_dizisi = @parse_ini_file($ini_dosya); // Bölümleri çözümlemez
if ($ini_dizisi) {
    echo "<h5>INI Dosya İçeriği (Bölümsüz):</h5><pre>";
    print_r($ini_dizisi);
    echo "</pre>";
} else {
    echo "<p>INI dosyası yüklenemedi veya mevcut değil.</p>";
}

$ini_dizisi_bolumlu = @parse_ini_file($ini_dosya, true); // Bölümleri de çözümler
if ($ini_dizisi_bolumlu) {
    echo "<h5>INI Dosya İçeriği (Bölümlü):</h5><pre>";
    print_r($ini_dizisi_bolumlu);
    echo "</pre>";
} else {
    echo "<p>INI dosyası yüklenemedi veya mevcut değil.</p>";
}

// Oluşturulan örnek dosyaları temizleyelim
@unlink($xml_dosya);
@unlink($ini_dosya);
?>

PHP'de include ve require fonksiyonları, modüler ve yönetilebilir web uygulamaları geliştirmenin temelidir. Hangi fonksiyonu ne zaman kullanacağınızı bilmek, uygulamanızın hataya dayanıklılığını ve performansını doğrudan etkiler. Ayrıca, dosya ve dizin işlemleriyle ilgili yardımcı fonksiyonlar, dinamik içerik yönetimi ve dosya tabanlı işlemler için vazgeçilmez araçlardır. Bu konulara hakim olmak, PHP geliştirme yolculuğunuzda size büyük kolaylık sağlayacaktır!

Webkolog'u takipte kalın!

Hepinize bol kodlu ve başarılı projeler dilerim!

0 yorum:

Yorum Gönder