v2.5.2
Giriş yap

extract Sorunu

coder
173 defa görüntülendi

Merhaba arkadaşlar.

Contollerdan model'e gönderilen diziyi ana model fonksiyonu içerisinde extract etmek istiyorum.
Ama uygulama esnasında ne yaptıysam sonuca ulaşamadım. print_r ile baktığımda dizi dönüyor.
Tek tek anahtarları yazdıramıyorum.

Ana Model Fonksiyonu

<?php
function Model($function, $data = NULL){

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

    if (function_exists($function)) {
        call_user_func($function,$data);
    } else {
        exit("Model dosyası içerisinde <b>".$function."</b> fonksiyonu tanımlanmamış!");
    }
}

Anasayfa Controller

<?php
function index(){
    $data = ["title" => "Anasayfa","icerik" => "Php"];
    Model("Listele",$data);
}

Anasayfa Model

<?php
function Listele($data){
    echo "<pre>"; print_r($data); echo "</pre>"; // Bu şekilde geriye dizi döndürüyor
    echo $title; // Bu şekilde yazdıramıyorum. Undefined veriable yazıyor.
    // Ancak burada extract($data) yaparsam ulaşabiliyorum.
}
Cevap yaz
Cevaplar (2)
kaanakgun
304 gün önce

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.

coder
303 gün önce

kaanakgun teşekkür ederim.