Zunächst ein kleines Vorwort: Nachfolgend werde ich häufiger die Begriffe konform und nicht-konform im Zusammenhang mit Dateien verwenden. Damit sind PHP-Dateien gemeint, die über den PSR-4-Autoloader von composer automatisch geladen werden können.
Ich hatte heute eine Diskussion über das Composer-Autoloading, bzw. konkreter über den PSR-4-Autoloading-Teil. Als Verfechter der Theorie, dass nicht alle konformen Dateien bei der Ausführung durch den Autoloader geladen werden, insbesondere ungenutzte, stand ich ziemlich alleine da. Die Gegenbehauptung war, alle konformen Dateien werden bei jeder Ausführung required, unabhängig davon, ob tatsächlich benötigt oder nicht.
Nach einiger Diskussion habe ich beschlossen meine Aussage zu beweisen. Der Beweis besteht aus den zwei Repositories musical-guacamole und fuzzy-giggle. musical-guacamole
required fuzzy-giggle
als Composer-Package, die vendor/autoload.php
für den Autoloader und ruft eine Methode aus der Klasse MyClass
des fuzzy-giggle
-Packages auf. Ein echo
außerhalb der Klasse dient als Prüfung, ob die Datei required wurde oder nicht. Schauen wir uns den Code an:
Main.php
in musical-guacamole
:
<?php
namespace Angelocali\MusicalGuacamole;
use Angelocali\FuzzyGiggle\MyClass;
require_once '../vendor/autoload.php';
MyClass::hello();
Code-Sprache: HTML, XML (xml)
MyClass.php
in fuzzy-giggle
:
<?php
namespace Angelocali\FuzzyGiggle;
class MyClass {
public static function hello() {
echo 'Hello World!';
}
}
echo 'Outside class';
Code-Sprache: HTML, XML (xml)
Führen wir die Main.php
aus, werden beide Strings ausgegeben. Entfernen wir die neunte Zeile aus der Main.php
, erfolgt keine Ausgabe. Das require
wird also nicht inflationär für alle konformen Dateien verwendet, sondern nur nach Bedarf.
Q.E.D.
Zukünftig versuche ich meine Argumente früher in Form eines Praxisbeispiels zu demonstrieren. Das hätte meiner Meinung nach schneller gezeigt, dass es sich bei der ursprünglichen Fragestellung gar nicht darum handelte, ob alle konformen Dateien immer geladen werden, sondern, wie man nicht-konforme Dateien der required’en Packages immer/bei jedem Request lädt.
Das funktioniert übrigens wunderbar über die Konfiguration des Autoloaders.
Ein Kommentar
Likes