Guten Tag zusammen,
ich habe hier bei PHP 7.3 (Apache 2.4.38) ein seltsames Problem und konnte dazu auch per Suchmaschine nichts finden.
Sachverhalt:
1. In Datei 'A.phtml' wird eine Datei 'B.inc.php' includiert und in diese wird wiederum eine Includierung der Datei 'C.inc.php' vorgenommen.
2. In Datei 'B.inc.php' werden Variablen aus Datei 'DATEN.inc.php' per require_once includiert und stehen in Datei 'B.inc.php' auch zur Verfügung.
Wenn ich jetzt Punkt 2 jedoch mit Datei 'C.inc.php' durchführe (also ebenfalls ein require_once), kommt zwar kein Fehler zustanden (da es zu keinem Abbruch kommt), aber die Daten der Datei 'DATEN.inc.php' stehen hier nicht [mehr?] zur Verfügung - es scheint so, als wären sie niemals includiert gewesen.
Und jetzt kommts: Wenn ich aber aus dem require_once (in der Datei 'C.inc.php') ein require mache, werden die Daten includiert und sind dort verfügbar.
Kann mir da wer bitte weiterhelfen/mich aufklären?
Wird bei PHP nur eine bestimmte Verschachtelungstiefe der require_once-Anweisung berücksichtigt, oder warum das seltsame Verhalten?
LG
[gelöst] PHP 7.3 require und require_once - seltsames Verhalten
[gelöst] PHP 7.3 require und require_once - seltsames Verhalten
Zuletzt geändert von incident am 09.02.2022 13:23:34, insgesamt 1-mal geändert.
Re: PHP 7.3 require und require_once - seltsames Verhalten
Eine Datei wird bei `require_once' nur genau einmal included, naemlich da wo das `require_once' zum ersten Mal auftaucht. Wenn es in B zuerst kommt bevor du dort C inkludierst, dann wird es in C nicht mehr inkludiert werden, da es schon einmal inkludiert worden ist. Setzt du das `include_once' von Daten in B hinter das Include von C, dann wird es zuerst in C inkludiert werden und in B dann nicht mehr. (Ich habe das nicht getestet, bin mir aber sicher, dass es so ist.)
Das von dir beschrieben Verhalten ist fuer mich in jeder Weise logisch und auch nicht ueberraschend. Vielleicht hast du nicht genau verstanden was `require_once' bedeutet oder wie das Inkludieren und Zusammenfuegen des gesamten Scriptcodes funktioniert.
Zum konkreten Problem: Ich denke, du musst in B nur das Include von C vor das Include von Daten setzen und alles verhaelt sich dann wie du es erwartest.
Das von dir beschrieben Verhalten ist fuer mich in jeder Weise logisch und auch nicht ueberraschend. Vielleicht hast du nicht genau verstanden was `require_once' bedeutet oder wie das Inkludieren und Zusammenfuegen des gesamten Scriptcodes funktioniert.
Zum konkreten Problem: Ich denke, du musst in B nur das Include von C vor das Include von Daten setzen und alles verhaelt sich dann wie du es erwartest.
Use ed once in a while!
Re: PHP 7.3 require und require_once - seltsames Verhalten
Hallo Meillo,
danke für Deine Antwort.
Somit ist es eben für mich nicht nachvollziehbar, dass die Daten nicht in Datei-C vorhanden sind. Ich bin das Design gerade noch einmal durchgegangen und finde keinen Fehler...
Nachtrag: Macht es einen Unterschied, ob das require bzw. require_once in einer Funktion steht?
danke für Deine Antwort.
Und das inkludierte ist gültig ab sofort für alle weiteren Prozesse/inkludierte Daten/Dateien, richtig?Meillo hat geschrieben:09.02.2022 10:52:01Eine Datei wird bei `require_once' nur genau einmal included, naemlich da wo das `require_once' zum ersten Mal auftaucht. Wenn es in B zuerst kommt bevor du dort C inkludierst, dann wird es in C nicht mehr inkludiert werden, da es schon einmal inkludiert worden ist.
Ja, das ist logisch nachvollziehbar, auch für mich.Meillo hat geschrieben:09.02.2022 10:52:01Setzt du das `include_once' von Daten in B hinter das Include von C, dann wird es zuerst in C inkludiert werden und in B dann nicht mehr. (Ich habe das nicht getestet, bin mir aber sicher, dass es so ist.)
Ich habe require_once so verstanden, wie ich es gelesen habe - nämlich, dass mit require_once genau einmal eine Datei inkludiert wird (und dann nicht mehr, egal wie oft PHP noch diese Inkludierung vorfindet) und die inkludierten Daten dann auch für den ganzen nachfolgenden Programmablauf zur Verfügung stehen.Meillo hat geschrieben:09.02.2022 10:52:01Das von dir beschrieben Verhalten ist fuer mich in jeder Weise logisch und auch nicht ueberraschend. Vielleicht hast du nicht genau verstanden was `require_once' bedeutet oder wie das Inkludieren und Zusammenfuegen des gesamten Scriptcodes funktioniert.
Nun, es ist so, dass die zu inkludierenden Daten in der Datei 'config.in.php' (im Beispiel oben ist das die 'DATEN.inc.php'-Datei) sind und diese Inkludierung quasi in jeder PHP-Datei (jedenfalls dort wo die Daten wirklich gebraucht werden) an fast erster Stelle (als include_required) steht - noch bevor etwas anderes inkludiert wird (aber nach 'session_start()').Meillo hat geschrieben:09.02.2022 10:52:01Zum konkreten Problem: Ich denke, du musst in B nur das Include von C vor das Include von Daten setzen und alles verhaelt sich dann wie du es erwartest.
Somit ist es eben für mich nicht nachvollziehbar, dass die Daten nicht in Datei-C vorhanden sind. Ich bin das Design gerade noch einmal durchgegangen und finde keinen Fehler...
Nachtrag: Macht es einen Unterschied, ob das require bzw. require_once in einer Funktion steht?
Re: PHP 7.3 require und require_once - seltsames Verhalten
Ja.incident hat geschrieben:09.02.2022 11:45:18Und das inkludierte ist gültig ab sofort für alle weiteren Prozesse/inkludierte Daten/Dateien, richtig?
Dann ist der inkludierte Code halt auf den Scope der Funktion beschraenkt (und man kann in PHP natuerlich keine Funktionen in Funktionen definieren), sonst hat es aber keine Auswirkungen. Guter Stil ist das eher nicht.incident hat geschrieben:09.02.2022 11:45:18Nachtrag: Macht es einen Unterschied, ob das require bzw. require_once in einer Funktion steht?
Vielleicht nochmal generell:
Der Unterschied zwischen `include' und `require' ist, dass `include' weitermacht falls die Datei nicht gefunden worden ist, waerend `require' dann mit einem Fehler abbricht.
In beiden Varianten wird bei `_once' die Datei nur beim ersten Mal eingebunden und alle weiteren Aufrufe davon machen einfach gar nichts. Das will man normalerweise wenn man Funktionen inkludiert. Ohne `_once' wird die Datei jedes Mal neu eingebunden. Das wuerde man eher verwenden wenn man direkt imperativen Code an die Stelle holen will ... was aber meist schlechter Stil ist.
`require_once' ist die beste Variante, die man moeglichst verwenden sollte. Man sollte versuchen nur Definitionen (Variable, Funktionen, Klassen) zu inkludieren, nicht aber direkt imperativen Code. ... jedenfalls meiner Meinung nach.
Use ed once in a while!
Re: PHP 7.3 require und require_once - seltsames Verhalten
Bau doch mal ein Minimalbeispiel, das du hier posten kannst.incident hat geschrieben:09.02.2022 11:45:18Somit ist es eben für mich nicht nachvollziehbar, dass die Daten nicht in Datei-C vorhanden sind. Ich bin das Design gerade noch einmal durchgegangen und finde keinen Fehler...
(Alleine der Prozess, dies zu tun, oeffnet einem oft selbst die Augen. )
Use ed once in a while!
Re: PHP 7.3 require und require_once - seltsames Verhalten
@Meillo
Ich hab den Fehler gefunden .... ggggrrrrr.
1. Ich habe [nicht mehr] gewusst, dass man globale Variablen in einer PHP-Funktion dieser erst als "global zur Verfügung stehend" verklickern muss ...
2. Dadurch ist klar, dass ein require_once innerhalb einer Funktion nicht funktionieren kann, da ja auf der einen Seite bereits inkludiert wurde und auf der anderen Seite aber auf die inkludierten(/globalen) Daten von der Funktion aus, nicht ohne ein "global" vor den jeweiligen Variablen, zugegriffen werden kann. Da mach es ja schon einen Unterschied, ob diese Daten/Variablen mit require nochmal (innerhalb der Funktion) inkludiert werden und sie dann auch lokal (eben innerhalb der Funktion) zur Verfügung stehen.
Sorry für den unnötigen "Gesprächsstoff".
Vielen Dank für die Hilfestellung
LG
Ich hab den Fehler gefunden .... ggggrrrrr.
1. Ich habe [nicht mehr] gewusst, dass man globale Variablen in einer PHP-Funktion dieser erst als "global zur Verfügung stehend" verklickern muss ...
2. Dadurch ist klar, dass ein require_once innerhalb einer Funktion nicht funktionieren kann, da ja auf der einen Seite bereits inkludiert wurde und auf der anderen Seite aber auf die inkludierten(/globalen) Daten von der Funktion aus, nicht ohne ein "global" vor den jeweiligen Variablen, zugegriffen werden kann. Da mach es ja schon einen Unterschied, ob diese Daten/Variablen mit require nochmal (innerhalb der Funktion) inkludiert werden und sie dann auch lokal (eben innerhalb der Funktion) zur Verfügung stehen.
Sorry für den unnötigen "Gesprächsstoff".
Vielen Dank für die Hilfestellung
LG
Re: [gelöst] PHP 7.3 require und require_once - seltsames Verhalten
Danke fuer die Erklaerung des Phaenomens!
Viel Vergnuegen mit dem nun wieder funktionierenden Code.
Use ed once in a while!