php類別聲明與實例化的區別?
習慣沉默
習慣沉默 2017-05-16 13:10:23
0
2
489

我是一個菜鳥新手,我發現很多工具類,直接聲明就能用了,例如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()就是一個非靜態方法!

直接呼叫不會造成指標異常嗎?
新手求問!

習慣沉默
習慣沉默

全部回覆(2)
Ty80

php沒這種語法的
你看到的應該是類似這種吧
Route::get('/', function (IlluminateHttpRequest $request) {

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

});
這個是依賴注入
http://www.golaravel.com/lara...

过去多啦不再A梦

下面是錯的:認真看了一下原始碼,答案是不是這樣?

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

這兩段程式碼之前,使用了use IlluminateHttpRequest;

use只是使用了命名空間,但是要想呼叫類,必須載入類別檔案(require),或是自動載入。 ,lavavel使用的是自動加載,所以在我們看來use IlluminateHttpRequest後就相當於能直接用Request類,其實不是,使用Request類時laravel其實做了很多工作!
laravel的自動載入函數如下:

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

可以看出,如果你使用了一個未實例化的類別時,它會自動載入進來並且實例化。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板