2017-10-16 2 views
0

Ich schrieb eine Autoloader-Klasse.Variable außerhalb des Geltungsbereichs bei Verwendung von include_once

Aber die include_once Funktion enthält nicht die Datei, die ich brauche.

Cls.php (Pfad: cls /)

<?php 
    class fileup{ 
    function dup($a){ 
     $x=strip_tags($a); 

     $d=__DIR__."/".$x.".cls.php"; 
     echo $d; ///storage/emulated/legacy/htdocs/yeni/sinif/ayar.sinif.php 
     if(file_exists($d)){ 
      include_once $d; 
     }else{ 
     die($a." Class not found :("); 
     } 
    } 
    } 
$dup=new fileup(); 
spl_autoload_register(array($dup,"dup")); 
?> 

Theme.cls.php Theme Klasse (Pfad: cls /)

<?php 
    include_once("cls.php"); 
    $dup->dup("conf"); 
?> 

Conf.cls.php Site Config-Klasse (Pfad : cls/

)
<?php include_once("cls.php"); $dup->dup("db"); ?> 

index.php (Pfad: /)

<?php 
    include_once("theme.cls.php"); 
?> 

Fehlerdetails:

Fatal error: Uncaught Error: 
Call to a member function dup() on null in /storage/emulated/legacy/htdocs/yeni/sinif/conf.cls.php:3 
Stack trace: 
#0 /storage/emulated/legacy/htdocs/yeni/sinif/cls.php(12): 
**include_once() #1** 
/storage/emulated/legacy/htdocs/yeni/sinif/theme.cls.php(3): 
dup->dup('conf') #2 
/storage/emulated/legacy/htdocs/yeni/index.php(2): 
include_once('/storage/emulat...') #3 
{main} thrown in /storage/emulated/legacy/htdocs/yeni/sinif/conf.cls.php on line 3 
+1

Sie verwenden nicht Autoloading, wie es sollte verwendet werden. Es macht keinen Sinn, die Autoloader-Funktion direkt aufzurufen. Es gibt mehr Probleme mit Ihrem Code, aber Sie sollten etwas mehr Zeit damit verbringen, die Grundlagen zu studieren, bevor Sie sich damit beschäftigen. – yivi

+0

Ich verstehe, aber ich lerne PHP oop ich verstehe Fehler nicht, wie kann ich es lösen. wo Sie den falschen Code –

+1

Rundherum sehen. Wird Ihren Code nicht für Sie neu schreiben. Sie vermissen ein grundlegendes Verständnis der Thematik, um eine Qualitätsfrage dazu stellen zu können.Grundsätzlich ist die Verwendung von Autoloadern falsch und Ihr Autoloader ist schlecht geschrieben (er sollte nicht "sterben", wenn er nicht gefunden wurde, kehren Sie einfach zurück, damit andere Autoloader auch funktionieren). – yivi

Antwort

0

wollten eine Antwort nicht schreiben, aber ich denke, so kann man darüber hinaus bewegen: Ihr Problem Autoloader ist nicht verwandt, aber Umfang verwendet.

Zuerst definieren Sie unter Conf.cls.php. Dann auf Theme.cls.php, enthalten Sie diese Datei, so dass jetzt $dup definiert ist.

Nun rufen Sie $dup->dup('Conf') welche einschließlich Conf.cls.php am Ende wird, die diese enthält:

include_once("cls.php"); 
$dup->dup("conf"); 

In der ersten Zeile, die Sie include_once("cls.php"); nennen, aber da Sie diese Datei haben bereits enthalten früher in Theme.cls.php, diesmal wird es wieder nicht enthalten (Sie verwenden include_once immerhin, Schwerpunkt einmal).

Und da die Datei, in der Sie diese Klasse definieren und instanziieren, nicht enthalten ist, wird $dup nicht definiert, während sie sich auf Conf.cls.php befindet (z. B. null).

Also, wenn Sie $dup->dup("db"); anrufen, versuchen Sie tatsächlich null->dup("db"); anrufen, was natürlich keinen Sinn macht.

Der einfachste "Fix" wäre include statt include_once.

Darüber hinaus ist Ihr gesamtes Autoloader-Beispiel in mehr als einer Hinsicht falsch. Sie sollten ein bisschen mehr lernen, bevor Sie versuchen, Ihr eigenes zu schreiben.

Verwandte Themen