Dosya İçerisinde Fonksiyon Tanımlanmış mı?
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?
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.