v2.5.2
Giriş yap

Dosya İçerisinde Fonksiyon Tanımlanmış mı?

coder
151 defa görüntülendi

Merhaba arkadaşlar.
Aşağıdaki şekilde bir model dosyam var.

<?php

function Model($file, $function, $data = []){

    if(!is_null($data) && is_array($data)){
        extract($data);
    }

    if( file_exists(MODELS_DIR.$file.".php") ){
        require_once(MODELS_DIR.$file.".php");

        if (function_exists($function)) {
            call_user_func($function);
        } else {
            echo "<b>".$file."</b> model dosyası içerisinde <b>".$function."</b> fonksiyonu tanımlanmamış!";
        }

    }else{
        echo "<b>".$file."</b> model dosyası bulunamadı!";
    }

}

Kullanımı da şöyle

Blog Controller

function blog(){
    // Model("Dosya Adı","Fonksiyon Adı");
    Model("blog","vericek");
    
    // Dönen Veri
    $vericek =  vericek();
}

Blog Model

function vericek(){
    global $db;
    $bul = $db->prepare("SELECT * FROM blog");
    $bul->execute();
    $yaz = $bul->fetchAll(PDO::FETCH_ASSOC);

    return $yaz;
}

Sorum şu.
Ben Controller dosyasına bir defa blog model dosyasını dahil etmek istiyorum.
Ama daha sonra mesela yorumCek fonksiyonu olacak diyelim. Bu fonksiyonun daha önce dahil edilen model dosyası içerisinde olup olmadığını kontrol etmek istiyorum.
function_exists($function) ile yapılıyor ama sonradan yapılmasını istediğim için nasıl olması gerektiğini çözemedim.

Bunun için kodlarda nasıl bir değişiklik yapabiliriz?

ebykdrms
291 gün önce

Burada nesne yönelimli bir çözüm kullanabilirsiniz.
Modelleriniz birer class olmalı. Verdiğiniz örnek üzerinden ilerlersek...

blog.php sayfanızın adı, içereceği class adıyla aynı olsun. Class adları büyük harfle başlayacağı için dosya adı da büyük harfle başlasın.
Blog.php

class Blog {
  
  function vericek(){
    global $db;
    $bul = $db->prepare("SELECT * FROM blog");
    $bul->execute();
    $yaz = $bul->fetchAll(PDO::FETCH_ASSOC);
    return $yaz;
  }

}

Model fonksiyonunuz da bir class olsun:

class Model {
  
  public $model;
  public $error;
  
  public function __construct($name) {
    
    // MODELS_DIR klasöründe $name adında bir dosya varsa:
    if(file_exists(MODELS_DIR.$name.".php")){
      
      // Model dosyasını çağır
      require_once(MODELS_DIR.$name.".php");
      
      // Model dosyasında aynı isimle bir class yer alıyorsa:
      if(class_exists($name)) {
        
        // $model olarak bu sınıftan oluşturulan nesneyi belirle.
        $this->model = new $name();
        $this->error = null;
      }
      // Model dosyasında aynı isimle bir class yer almıyorsa:
      else {
        $this->error = "Model dosyasında $name adlı class bulunamadı.";
        $this->model = null;
      }
    }
    // MODELS_DIR klasöründe $name adında bir dosya yoksa:
    else {
      $this->error = "$name adlı model dosyası bulunamadı.";
      $this->model = null;
    }
  }
}

Artık Model class'ınız sayesinde istediğiniz model class'ından bir nesne türetip kullanabilirsiniz:

$blogModel = new Model('Blog');
if($blogModel->error) exit($blogModel->error);
$result = $blogModel->model->vericek();

echo "<pre>";
var_dump($result);
echo "</pre>";

Burada Blog.php dosyasını yeniden include etmeye gerek yok. Çünkü sınıfın bütün özelliklerini taşıyan bir nesnesi $blogModel->model içinde mevcut.