Model fonksiyonunuz içerisinde extract fonksiyonunu kullanarak $data dizisini değişkenlere ayırıyorsunuz, ancak call_user_func fonksiyonunu kullanırken Listele fonksiyonunuza $data dizisini bir bütün olarak gönderiyorsunuz. Bu durumda, Listele fonksiyonu içerisinde $title gibi değişkenlere doğrudan erişememenizin nedeni budur. Listele fonksiyonu içerisinde extract kullanmanız gerektiği gibi, ana Model fonksiyonu içerisinde extract kullanmanızın etkisi bu scope'ta kalmaktadır ve Listele fonksiyonunun scope'una taşınmamaktadır.
Bu sorunu çözmek için iki farklı yol izleyebilirsiniz:
call_user_func ile değişkenleri argüman olarak geçirin: call_user_func fonksiyonuna değişkenleri tek tek argüman olarak geçirebilirsiniz. Ancak, bu durumda Listele fonksiyonunuzun imzasını değiştirmeniz gerekecek ve bu da esnekliği azaltabilir.
Her model fonksiyonunda extract kullanın: Her model fonksiyonunun başında $data dizisini extract ederek kullanmaya devam edebilirsiniz. Bu, her fonksiyonun bağımsız olarak kendi içerisinde gerekli değişkenlere erişebilmesini sağlar.
Aşağıda, ikinci yöntemi kullanarak sorununuzu nasıl çözebileceğinizi gösteriyorum:
Ana Model Fonksiyonu:
<?php
function Model($function, $data = NULL){
if (function_exists($function)) {
call_user_func($function, $data);
} else {
exit("Model dosyası içerisinde <b>".$function."</b> fonksiyonu tanımlanmamış!");
}
}
?>
Anasayfa Model:
<?php
function Listele($data){
if(is_array($data)){
extract($data);
}
echo "<pre>"; print_r($data); echo "</pre>"; // Bu şekilde geriye dizi döndürüyor
echo $title; // Artık bu şekilde yazdırabilirsiniz.
}
?>
Bu yöntemle, Listele fonksiyonunun içinde extract kullanarak $data içindeki her bir anahtarı lokal değişken olarak tanımlarsınız ve bu değişkenlere doğrudan erişebilirsiniz. Bu, daha temiz bir çözüm sunar ve her model fonksiyonunun ihtiyaç duyduğu verilere erişimini kolaylaştırır.