Probleme mit aufeinanderfolgenden require


Sprint

Erfahrenes Mitglied
#1
Hallo zusammen,

um einen zu langen Code zu verhindern, habe ich Teile, die nicht immer benötigt werden, ausgelagert und importiere sie bei Bedarf über require.

Vorher werden aber noch verschiedene Klassen, wie z.B: PHPMailer, über require eingebunden. Und da beginnt nun mein Problem. Werden diese Klassen wie bisher als einziges geladen, funktioniert alles. Wird aber ein anderer Teil nachgeladen, in dem diese Klassen benötigt werden, wird die Klasse plötzlich nicht mehr gefunden.

PHP:
require '../vendor/autoload.php';

if (!empty($_POST['sendpdf'])){
    require 'includes/simsendpdf.php';
}
if (!empty($_POST['rechnung'])){
    require 'includes/simrechnung.php';
}
In diesem Fall bekomme ich vom Server die Meldung "PHP Fatal error: Class 'PHPMailer' not found in...". Setze ich den Inhalt der sim...pdf Dateien direkt ein, funktioniert es.

Ich habe auch schon versucht, den Aufruf der autoload.php in die includierten Dateien zu setzen (mit dem richtigen Pfad), aber auch da bekomme ich den Class not found Fehler.

Es kann doch eigentlich nicht sein, daß solche einfachen Konstrukte nicht möglich sind?
 

Yaslaw

n/a
Moderator
#2
Ich sehe hier nicht, wie deine Struktur ist und wo im simsendpdf.php der phpmailer eingebunden wird.
Bedenke, dass autoload.php und simsend.php nich im selben Verzeichniss sind.

Zudem solltest du require_once() verwenden um zu verhindern, dass es überschneidungen gibt

Ich selber habe für jedes Unterprojekt ein #.index als PHP-Datei in dem das Subprojekt definiert ist.
In der Initialdatei rufe ich dann nur noch das auf. Und zwar immer vom document_root aus. Damit ist es egal wo in der Ordnerstruktur ich gerade bin

PHP:
//   /index.php
if(!defined('C_ROOT')) define('C_ROOT', $_SERVER['DOCUMENT_ROOT']);

include_once C_ROOT.'/libs/#.index';
include_once C_ROOT.'/web/src/db/#.index';
include_once C_ROOT.'/web/src/parsers/#.index';
include_once C_ROOT.'/web/src/inc/#.index';
PHP:
//   /web/src/inc/#.index
include_once 'YException.inc';
include_once 'PathsEnum.inc';
include_once 'CallbackParser.inc';
include_once 'Callbacks.inc';
 

Sprint

Erfahrenes Mitglied
#3
Hallo Yaslaw,

sowohl die aufrufende Datei als auch der includes Ordner liegen in einem Ordner betrieb unterhalb des Root.

Die Pfade hier entsprechen noch dem anfänglichen Script. Ich habe da auch alles schon auf absolute Pfade umgestellt, hat aber auch nichts gebracht.

Ich habe heute Vormittag jetzt das ganze so umgebaut, daß die includierten Scripte keinen eigenen Maliversand mehr besitzen, sondern alle Mails in einer Liste gesammelt werden und dann von einem zentralen Versand aus verschickt werden. Damit geht es jetzt.

Aber auch da habe ich nichts anderes gemacht, als den Block aus einem der includes zu kopieren und in das aufrufende Script einzusetzen. Und das ist im Endeffekt das, was mich da so verwirrt. Include bzw. require machen doch eigentlich nichts anderes, als den externen Code an der entsprechenden Stelle einzukleben!?
 

Neue Beiträge