[gelöst] PHP 7.3 require und require_once - seltsames Verhalten

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
incident
Beiträge: 63
Registriert: 13.11.2021 14:54:52

[gelöst] PHP 7.3 require und require_once - seltsames Verhalten

Beitrag von incident » 09.02.2022 10:34:14

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
Zuletzt geändert von incident am 09.02.2022 13:23:34, insgesamt 1-mal geändert.

Benutzeravatar
Meillo
Moderator
Beiträge: 8876
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: PHP 7.3 require und require_once - seltsames Verhalten

Beitrag von Meillo » 09.02.2022 10:52:01

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.
Use ed once in a while!

incident
Beiträge: 63
Registriert: 13.11.2021 14:54:52

Re: PHP 7.3 require und require_once - seltsames Verhalten

Beitrag von incident » 09.02.2022 11:45:18

Hallo Meillo,

danke für Deine Antwort.
Meillo hat geschrieben: ↑ zum Beitrag ↑
09.02.2022 10:52:01
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.
Und das inkludierte ist gültig ab sofort für alle weiteren Prozesse/inkludierte Daten/Dateien, richtig?
Meillo hat geschrieben: ↑ zum Beitrag ↑
09.02.2022 10:52:01
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.)
Ja, das ist logisch nachvollziehbar, auch für mich. :D
Meillo hat geschrieben: ↑ zum Beitrag ↑
09.02.2022 10:52:01
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.
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: ↑ zum Beitrag ↑
09.02.2022 10:52:01
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.
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()').

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?

Benutzeravatar
Meillo
Moderator
Beiträge: 8876
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: PHP 7.3 require und require_once - seltsames Verhalten

Beitrag von Meillo » 09.02.2022 13:03:32

incident hat geschrieben: ↑ zum Beitrag ↑
09.02.2022 11:45:18
Und das inkludierte ist gültig ab sofort für alle weiteren Prozesse/inkludierte Daten/Dateien, richtig?
Ja.

incident hat geschrieben: ↑ zum Beitrag ↑
09.02.2022 11:45:18
Nachtrag: Macht es einen Unterschied, ob das require bzw. require_once in einer Funktion steht?
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.



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!

Benutzeravatar
Meillo
Moderator
Beiträge: 8876
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: PHP 7.3 require und require_once - seltsames Verhalten

Beitrag von Meillo » 09.02.2022 13:04:35

incident hat geschrieben: ↑ zum Beitrag ↑
09.02.2022 11:45:18
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...
Bau doch mal ein Minimalbeispiel, das du hier posten kannst.

(Alleine der Prozess, dies zu tun, oeffnet einem oft selbst die Augen. ;-) )
Use ed once in a while!

incident
Beiträge: 63
Registriert: 13.11.2021 14:54:52

Re: PHP 7.3 require und require_once - seltsames Verhalten

Beitrag von incident » 09.02.2022 13:22:45

@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 :roll: ...
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. :facepalm:

Sorry für den unnötigen "Gesprächsstoff". :D

Vielen Dank für die Hilfestellung :THX:
LG

Benutzeravatar
Meillo
Moderator
Beiträge: 8876
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: [gelöst] PHP 7.3 require und require_once - seltsames Verhalten

Beitrag von Meillo » 09.02.2022 13:28:31

;-)

Danke fuer die Erklaerung des Phaenomens!

Viel Vergnuegen mit dem nun wieder funktionierenden Code.
Use ed once in a while!

Antworten