method_exists Sorunu
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(){}
}
Soru hatalı mı? 👎
Eğer sorunun kurallara aykırı olduğunu düşünüyorsanız lütfen bize bildirin!
Cevaplar (2)
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, $ClassObject
i 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ı!");