PHP rocks! wünscht allen Mitgliedern einen guten Rutsch ins neue Jahr 2017 !!!
Hinweis: Das Forum zieht um! Um keine Datenverluste zu haben, schalten wir zwecks Übernahme der Daten das Forum am Sonntag, den 24.04.2016 um ca. 21:00 Uhr offline und passen anschliessend die DNS-Einträge an.
www.php-rocks.de wird euch dann nach den Aktualisierungen der DNS-Server wieder wie gewohnt uneingeschränkt zur Verfügung stehen.
Danke für euer Verständnis!

Themabewertung:
  • 0 Bewertung(en) - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Does MyClass::class autoload MyClass?
#1
Nabend,
sollte ich eigentlich selbst herausfinden können, schmeiße aber die Überlegung mal in den Raum:

Es geht um die vordefinierte ::class Klassenkonstante.
Wenn ich sie benutze, versucht php dann die Klasse zu laden, oder wird der Klassenname geparsed ohne die Klasse autozuloaden?
Hintergrund: Ich habe eine spl_autoload_register function welche php klassen code per remote lädt.
Es wäre ein ziemlicher overhead wenn die Klasse geladen wird wenn ich nur den Klassennamen als string (für lazy loading) brauche.

Beispiel:
PHP-Code:
        $this->getContainer()->set(\Webfan\App\Rpc\Procedure\install_requirements::class, function(\Psr\Container\ContainerInterface $c) { 
                    return new \
Webfan\App\Rpc\Procedure\install_requirements($c->get('webfan.app.rpc.auth-shield'), $c);                
        });                
        
$this->getContainer()->get('webfan.app.rpc.server')
               ->
set('install.requirements', \Webfan\App\Rpc\Procedure\install_requirements::class)
            ; 

vs.
PHP-Code:
        $this->getContainer()->set('\Webfan\App\Rpc\Procedure\install_requirements', function(\Psr\Container\ContainerInterface $c) { 
                    return new \
Webfan\App\Rpc\Procedure\install_requirements($c->get('webfan.app.rpc.auth-shield'), $c);                
        });                
        
$this->getContainer()->get('webfan.app.rpc.server')
               ->
set('install.requirements''\Webfan\App\Rpc\Procedure\install_requirements')
            ; 
Antworten
#2
Hi Till,

Gute Frage, kann ich ehrlich gesagt gar nicht exakt beantworten, aber ich hau mal meine Gedanken dazu in den Raum:
Ich würde meinen, das Autoloading wird nur getriggert, wenn eine Klasse instanziiert wird, was ja prinzipiell nicht der Fall ist.

Daher sollte grundsätzlich keine Klasse geladen werden in dem Moment.
Allerdings muss die Klasse ja im Scope bekannt sein, was bedeutet, dass sie evtl. doch geladen werden muss?

Ich nutze ::class bisher nicht, daher sind das nur mal meine Gedanken dazu.
Vielleicht hilfts..., wenn nicht, einfach ignorieren Wink

Gruß Arne
Antworten
#3
Hallo Arne,
Zitat:Gute Frage
Du weißt selber das die Frage dumm ist, trotzdem danke für die Antwort!
Statt einfach
PHP-Code:
echo DoYouExist::class; 
zu testen, habe ich einfach mal zuerst soziale Interaktion gesucht. Smile

PHP-Code:
Ich nutze ::class bisher nicht 
Warum?
Zitat:daher sind das nur mal meine Gedanken dazu.
Gut das wir uns nun Gedanken gemacht haben, nun kann ich zu der Meinung kommen das das ::class Konstrukt nur Vorteile bringt.

Viele Grüße aus dem schönen und sonnigen Bochum
Till
Antworten
#4
Und hat der Test ergeben, dass das Autoloading getriggert wird oder nicht?
Antworten
#5
Es hat keinen fatalen oder sonstwie gemeldeten Fehler erzeugt, also gehe ich davon aus das das autoloading nicht getriggert wird.
Alles andere wäre auch in der praktischen Anwendungsmöglichkeit irgendwie nicht wirklich von Mehrwert (edit: oder? vielleicht höchstens bei einer "Ahead of time" compilation als Type check).
Antworten
#6
Ich hab das eben mal selber nachgestellt aus Neugier:
PHP-Code:
spl_autoload_register(function($class) {

 echo 
'triggerd';
 
$sFilePath __DIR__ pathinfo$classPATHINFO_BASENAME );

 if ( !
file_exists($sFilePath) )
 throw new 
Exception'class "' $sFilePath '" not found...' );

 include_once 
$sFilePath;

});



echo 
Development\Test\TestClass::class; 
Ausgabe ist lediglich der Klassenname inkl. Namespace. Das Autoloading wird also nicht getriggert.

Gruß Arne
Antworten


Gehe zu: