Heim  >  Artikel  >  Backend-Entwicklung  >  Ausführliche Erläuterung der PHP-Anforderungen und -Einbindungsreihenfolge

Ausführliche Erläuterung der PHP-Anforderungen und -Einbindungsreihenfolge

黄舟
黄舟Original
2017-06-25 10:55:071217Durchsuche

In großen Webprojekten ist include_path die Grundlage eines modularen Designs (natürlich gibt es auch viele Designs, die auf Autoload basieren, was diesen Artikel nicht betrifft ) Diskussion), aber gerade wegen include_path stoßen wir oft auf einige scheinbar „seltsame“ Probleme, die dadurch verursacht werden, dass nicht die richtige Datei gefunden wird.

Es gibt auch die folgenden Fragen:

Wie Funktioniert include_path?

Wie ist die Reihenfolge, wenn es mehrere include_paths gibt?

Unter welchen Umständen funktioniert include_path nicht?

Heute gebe ich einen umfassenden Überblick Einführung in dieses Problem, beginnend mit einem Beispiel.

Die folgende Verzeichnisstruktur:

  root    
  ├ 1.php    
  ├ 3.php    
  └ subdir         
  ├ 2.php          
  └ 3.php

ist in 1. In PHP:

Der Code lautet wie folgt:

<?php 
ini_set("include_path", ".:path_to_subdir"); 
require
("2.php"); 
?>


Und in 2.php:

<?php 
require("3.php"); 
?>

Und in 3 im Stammverzeichnis gibt .php „root“ aus, und 3.php im Unterverzeichnis gibt „subdir“ aus;

Jetzt kommt meine Frage:
1. Welche Ausgabe erhalten Sie, wenn Sie im Stammverzeichnis 1.php ausführen?
2. Führen Sie 1.php im oberen Verzeichnis unter Unterverzeichnis aus. Welche Ausgabe erhalten Sie?
3 Ausgabe der beiden oben genannten Fragen?
include_path in PHP
Wenn PHP auf die Anweisung require(_once)/include(_once) stößt, wird zunächst folgendes Urteil gefällt: Ist der Dateipfad soll ein absoluter Pfad eingefügt werden?

Wenn ja, fügen Sie ihn direkt ein und beenden Sie ihn.
Wenn nicht, geben Sie nach mehreren Aufrufen das Makro _php_stream_fopen_with_path ein, um nach dieser Datei zu suchen


Als nächstes wird in _php_stream_fopen_with_path die folgende Beurteilung vorgenommen:

Ist der einzufügende Dateipfad ein relativer Pfad? ( In der Form ./file, . ./dir/file, verwenden Sie stattdessen „Verzeichnisrelativer Pfad“ unten)?
Wenn ja, überspringen Sie die Logik von include_path und analysieren Sie direkt den relativen Pfad (später separat eingeführt)


wird eine Kandidatenverzeichnisliste basierend auf include_path und dem Pfad der aktuellen Ausführungsdatei erstellen. Für das Beispiel im vorherigen Artikel wird beispielsweise die folgende Kandidatenliste erstellt

Der Code lautet wie folgt :

".:path_to_subdir:current_script_dir

Nehmen Sie dann ausgehend vom Kopf der Kandidatenliste einen Pfad in der Kandidatenliste gemäß DEFAULT_DIR_SEPARATOR (die Umgebung dieses Artikels ist „):“ und geben Sie dann den Pfad ein Eingebunden werden Der Dateiname wird an diesen Pfad angehängt und es wird versucht, zurückzukehren, ansonsten können wir mit dem nächsten Kandidatenpfad fortfahren
Bis jetzt können wir die drei Fragen beantworten, die ich am Anfang gestellt habe 🎜>1 . Da es im Stammverzeichnis ausgeführt wird, funktioniert der zweite Kandidatenpfad von include_path (path_to_subdir), wenn 2.php in 1.php enthalten ist, path_to_subdir/2.php wird gefunden und 2.php wird eingebunden Wenn 3.php verwendet wird, befindet sich das aktuelle Arbeitsverzeichnis im Stammverzeichnis. Wenn also 3.php eingebunden wird, wird die passende Datei im ersten Kandidatenpfad von include_path „“ (aktuelles Arbeitsverzeichnis) gefunden, sodass die Ausgabe erhalten wird „root“
2. Dasselbe wie 1, außer dass der aktuelle Pfad „subdir“ ist, also die Ausgabe „subdir“ ist. Da es keinen include_path im aktuellen Pfad gibt, wird er im Root ausgeführt Verzeichnis Wenn 2.php 3.php enthält, spielt path_to_subdir eine Rolle. Unabhängig davon, ob es sich im Stammverzeichnis oder im Unterverzeichnis befindet, erhalten Sie die Ausgabe von „subdir“. Und wenn Sie „include_path“ in 2.php löschen,



Dann wird current_script_dir wirksam, und zu diesem Zeitpunkt ist current_script_dir der Pfad von 2.php, sodass Sie immer noch die Ausgabe von „subdir“ erhalten
<?php 
ini_set("include_path", &#39;&#39;); 
require("3.php"); 
?>

Bei Verwendung eines relativen Verzeichnispfads ist der Basispunkt des relativen Pfads immer das aktuelle Arbeitsverzeichnis
Um die Situation unter einem relativen Verzeichnispfad zu veranschaulichen, werfen wir einen weiteren Blick auf die Verzeichnisstruktur oben. , aber 1.php wird zu:


2.php wird zu:

<?php 
ini_set("include_path", "/"); 
require("./subdir/2.php"); ?>

Bei Ausführung im Stammverzeichnis wird nach 3 gesucht. php in 2.php wird im relativen Pfad des aktuellen Verzeichnisses durchsucht, sodass die erhaltene Ausgabe „root“ ist, und wenn 1.php des übergeordneten Verzeichnisses unter dem Unterverzeichnis ausgeführt wird (php -f .. /1. php) wird abnormal beendet, da „./subdir/2.php“ nicht unter Unterverzeichnis

Postscript
<?php 
require("./3.php"); 
?>

1 gefunden werden kann. In diesem Fall wird die Leistung verwendet Wenn Sie 10 include_paths haben, kann es im schlimmsten Fall bis zu 11 Wiederholungen dauern, bis die einzuschließende Datei gefunden wird absolute Pfade.
2. Da der relative Pfad des Verzeichnisses immer der aktuelle Arbeitspfad ist, muss er mit dem tatsächlichen Bereitstellungspfad verknüpft werden, daher wird er in der Praxis selten verwendet Natürlich kann dies auch mit Hilfe des chdir-Moduls erfolgen.
3 Im modularen Systemdesign sollte der Bereitstellungspfad des Moduls im Allgemeinen innerhalb des Moduls ermittelt werden (dirname
(DATEI). Nach php5.3 werden DIR-Konstanten bereitgestellt, also absolute Pfade.

Das obige ist der detaillierte Inhalt vonAusführliche Erläuterung der PHP-Anforderungen und -Einbindungsreihenfolge. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn