Quelle est la différence entre la déclaration de classe PHP et l'instanciation ?
習慣沉默
習慣沉默 2017-05-16 13:10:23
0
2
484

Je suis un débutant et j'ai découvert que de nombreuses classes d'outils peuvent être utilisées en les déclarant directement, comme celles de Laravel

Demande $request;
$request->get();

Cela me laisse perplexe. Est-ce que déclarer une variable de classe instancie le code ?
Après une recherche sur Baidu, personne n'a posé de questions sur ce problème en langage PHP, uniquement Java, et Java ressemble à ceci :
Class1 item1 ;Déclarer un objet
Générer un type de référence , Occupant 4 octets de mémoire, quel que soit le type (objet o ou From f) de la référence, elle occupe 4 octets de mémoire
Class1 item1 = new Class1();
Create une instance de classe, ouvrez un morceau de mémoire (cette mémoire est liée à la taille de la classe elle-même), et laissez l'élément de référence1 pointer vers la position de départ de cette mémoire

;

Si c'est le cas, $request est juste une référence à Request, et Request n'a pas encore été instancié et n'existe pas en mémoire. , alors pourquoi $request peut-il utiliser directement les méthodes qu'il contient ? Après avoir examiné le code source, bien que les propriétés et méthodes de cette classe soient static statiques et existent déjà dans la mémoire avant l'instanciation, il existe également de nombreuses propriétés et méthodes non statiques, get() est un méthode non statique !

L'appeler directement ne provoquerait-il pas une exception de pointeur ?
Demandez à un débutant !

習慣沉默
習慣沉默

répondre à tous(2)
Ty80

PHP n'a pas ce genre de syntaxe
Ce que vous voyez devrait ressembler à ceci
Route::get('/', function (IlluminateHttpRequest $request) {

return view('welcome', ['a'=>$request->get('a',1)]);

});
C'est l'injection de dépendances
http://www.golaravel.com/lara...

过去多啦不再A梦

Ce qui suit est faux : après avoir examiné attentivement le code source, la réponse est-elle comme celle-ci ?
à

Request $request;
$request->get();

Avant ces deux morceaux de code, j'utilisais use IlluminateHttpRequest;

use utilise simplement l'espace de noms, mais si vous souhaitez appeler la classe, vous devez charger le fichier de classe (obligatoire) ou le charger automatiquement. , lavavel utilise le chargement automatique, donc à notre avis, utiliser IlluminateHttpRequest équivaut à pouvoir utiliser directement la classe Request. En fait, ce n'est pas le cas de Laravel qui utilise la classe Request !
La fonction de chargement automatique de Laravel est la suivante :

 public static function getLoader()
    {
        if (null !== self::$loader) {
            return self::$loader;
        }

        spl_autoload_register(array('ComposerAutoloaderInit67db7509c61e60a4f92e012c704d3566', 'loadClassLoader'), true, true);
        self::$loader = $loader = new \Composer\Autoload\ClassLoader();
        spl_autoload_unregister(array('ComposerAutoloaderInit67db7509c61e60a4f92e012c704d3566', 'loadClassLoader'));

        $map = require __DIR__ . '/autoload_namespaces.php';
        foreach ($map as $namespace => $path) {
            $loader->set($namespace, $path);
        }

        $map = require __DIR__ . '/autoload_psr4.php';
        foreach ($map as $namespace => $path) {
            $loader->setPsr4($namespace, $path);
        }

        $classMap = require __DIR__ . '/autoload_classmap.php';
        if ($classMap) {
            $loader->addClassMap($classMap);
        }

        $loader->register(true);

        $includeFiles = require __DIR__ . '/autoload_files.php';
        foreach ($includeFiles as $fileIdentifier => $file) {
            composerRequire67db7509c61e60a4f92e012c704d3566($fileIdentifier, $file);
        }

        return $loader;
    }
}

On voit que si vous utilisez une classe non instanciée, elle sera automatiquement chargée et instanciée.

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal