v2.5.2
Giriş yap

method_exists Sorunu

coder
154 defa görüntülendi

Merhaba arkadaşlar.

Controller sınıfında method_exists fonksiyonunda aşağıdaki hatayı alıyorum.
Else kısmına echo iler bir şey yazdırdığımda else kısmı çalışıyor.
Sorunu çözemedim.
call_user_func_array kısmında echo ile bir şey yazsa bile else kısmı çalışıyor.

App Sınıfı

<?php
class App{
    public function __construct(){
        
        if(!empty($_GET["url"])){

            switch($_GET["url"])
            {
                case "admin"	: 
                    new Controller("admin","Listele",['ad'=>"Ahmet"]);
                break;
            }
        }
    }
}
  

Controller Sınıfı

<?php
class Controller{

    public function __construct($Controller,$Method,$Parameters){

        $ControllerDir = CONTROLLERS_DIR;
        $ControllerFile =  $Controller.'.controller.php';

        if (file_exists($ControllerDir.$ControllerFile)) {

            require_once $ControllerDir.$ControllerFile;

            if (class_exists($Controller)) {
                $ClassName = new $Controller();
                
                if (method_exists($ClassName, $Method)) {
                    call_user_func_array([$ClassName, $Method], $Parameters);
                } else {
                    exit('<b>' . $ClassName . '</b> isimli sınıfta <b>' .  $Method . '</b> methodu bulunamadı!');
                }
               
        
            }else {
                exit('<b>' . $ControllerFile . '</b> isimli controller dosyasında <b>' . $ClassName . '</b> sınıfı bulunamadı!');
            }
    
        }else{
            exit("<b>".CONTROLLERS_DIR."</b> klasöründe <b>".$Controller.".controller.php </b> controller dosyası bulunamadı!");
        }
        
    }

}
  

admin.controller.php

<?php
Class Admin{
    public $a = "10";

    public function dene(){}

}
Cevap yaz
Cevaplar (2)
ebykdrms
303 gün önce

echo attığınızda else bloğuna giriyorsanız -ki aldığınız hata da bunu destekliyor- şu anlama gelir:
'Admin' adlı class'ınızın içinde 'Listele' adlı bir fonksiyona ulaşılamıyor.
O zaman düzgün bir şekilde *Admin isimli sınıfta Listele methodu bulunamadı!* yazmasını bekliyorsunuz ama hata mesajı dönüyor.
Hata mesajı: Object of class Admin could not be converted string.
Yani: Admin class'ının objesi string'e dönüştürülemedi.

$ClassName değişkeninizde Admin class'ından türetilen obje var.
'<b>' . $ClassName . '</b> isimli sınıfta <b>' . $Method . '</b> methodu bulunamadı!' şeklinde bir string birleştirme işlemi yapıyorsunuz ama string'in içine object'i yerleştiremiyor.
Bu karışıklık, değişken adınızın yanıltıcı olmasından kaynaklanıyor. Değişken adınız $ClassName sanki içinde bir string ifade barındırıyormuş gibi düşündürüyor.
Bu isim yerine yerine $ClassObject ismi verilebilir. Böylece değişkenin adı bile yanlış kullandığınız yerde sorunu fark etmenize yardımcı olur.
Yani öncelikle $ClassName değişkeninizin adını $ClassObject olarak güncellemelisiniz.

Sorunu çözmek için de, $ClassObjecti tanımladığınız satırın hemen altına bir $ClassName değişkeni tanımlayın ve sınıfın adını (string olarak) buraya atayın.

$ClassObject = new $Controller();
$ClassName = get_class($ClassObject); // Objenin türetildiği sınıfın adını string olarak verir.

if (method_exists($ClassObject, $Method)) {
    call_user_func_array([$ClassObject, $Method], $Parameters);
} else {
    exit("<b>$ClassName</b> isimli sınıfta <b>$Method</b> fonksiyonu bulunamadı!");
}

Gözüme çarptığı kadarıyla şu satırda da henüz karşılaşmadığınız bir sorun var:

exit('<b>' . $ControllerFile . '</b> isimli controller dosyasında <b>' . $ClassName . '</b> sınıfı bulunamadı!');

Burada kullandığınız $ClassName değişkeni hiç oluşturulmamış bir değişken. Yani bu değişken yalnızca if bloğunda oluşturuluyor. Bu yüzden else bloğunda bu değişkene erişemezsiniz. Yani PHP belki bir esneklik sunuyordur ama en iyi ihtimalle hata almak yerine boş string elde edersiniz.
Bu satırı da şu şekilde düzeltebilirsiniz:

exit("<b>$ControllerFile</b> isimli controller dosyasında <b>$Controller</b> sınıfı bulunamadı!");
coder
300 gün önce

Teşekkür ederim.