Rumah  >  Soal Jawab  >  teks badan

php类声明与实例化的区别?

我是一个菜鸟新手,我发现很多工具类,直接声明就能用了,例如laravel里的

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

这让我很不解,声明一个类变量难道就实例化了码?
百度了一下,关于这个问题php语言居然没有一个人问,只有java,java是这样的:
Class1 item1;声明一个对象
生成一个引用类型,占4字节内存,不管是什么类型(object o或From f)的引用都是占用4字节内存
Class1 item1 = new Class1();
创建一个类实例,开辟一块内存(这块内存跟类本身的大小有关),并且让引用item1指向这块内存的起始位置;

如果是这样,$request只是一个Request的引用,而Request还没实例化,在内存中是不存在的,那为什么$request能直接用里面的方法呢?看了一下源代码,虽然这个类里面的属性和方法有static静态的,在实例化之前就已经存在内存中了,但也有很多非静态的属性和方法啊,get()就是一个非静态方法!

直接调用不会引起指针异常吗?
新手求问!

習慣沉默習慣沉默2737 hari yang lalu474

membalas semua(2)saya akan balas

  • PHP中文网

    PHP中文网2017-05-16 13:12:23

    PHP tidak mempunyai sintaks seperti ini
    Apa yang anda lihat sepatutnya seperti ini
    Route::get('/', function (IlluminateHttpRequest $request) {

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

    });
    Ini adalah suntikan pergantungan
    http://www.golaravel.com/lara...

    balas
    0
  • 过去多啦不再A梦

    过去多啦不再A梦2017-05-16 13:12:23

    Perkara berikut adalah salah: Selepas melihat dengan teliti kod sumber, adakah jawapannya seperti ini?
    di

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

    Sebelum dua keping kod ini, saya menggunakan use IlluminateHttpRequest;

    gunakan hanya menggunakan ruang nama, tetapi jika anda ingin memanggil kelas, anda mesti memuatkan fail kelas (memerlukan), atau memuatkannya secara automatik. , lavavel menggunakan pemuatan automatik, jadi pada pendapat kami, menggunakan IlluminateHttpRequest adalah sama dengan dapat menggunakan kelas Permintaan secara langsung, sebenarnya, ia tidak melakukan banyak kerja apabila menggunakan kelas Permintaan!
    Fungsi pemuatan automatik Laravel adalah seperti berikut:

     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;
        }
    }
    

    Ia boleh dilihat bahawa jika anda menggunakan kelas yang tidak segera, ia akan dimuatkan secara automatik dan dibuat seketika.

    balas
    0
  • Batalbalas