PHP Rocks
Does MyClass::class autoload MyClass? - Druckversion

+- PHP Rocks (https://www.php-rocks.de)
+-- Forum: PHP Programmierung (https://www.php-rocks.de/https://www.php-rocks.de/forum/1-php-programmierung.html)
+--- Forum: PHP Basics (https://www.php-rocks.de/https://www.php-rocks.de/forum/2-php-basics.html)
+--- Thema: Does MyClass::class autoload MyClass? (/https://www.php-rocks.de/thema/341-re-does-myclass-class-autoload-myclass-.html)



Does MyClass::class autoload MyClass? - Till - 03.08.2019

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')
            ; 



RE: Does MyClass::class autoload MyClass? - Arne Drews - 05.08.2019

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


RE: Does MyClass::class autoload MyClass? - Till - 05.08.2019

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


RE: Does MyClass::class autoload MyClass? - Arne Drews - 05.08.2019

Und hat der Test ergeben, dass das Autoloading getriggert wird oder nicht?


RE: Does MyClass::class autoload MyClass? - Till - 05.08.2019

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).


RE: Does MyClass::class autoload MyClass? - Arne Drews - 06.08.2019

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