我是一個菜鳥新手,我發現很多工具類,直接聲明就能用了,例如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()就是一個非靜態方法!
直接呼叫不會造成指標異常嗎?
新手求問!
php沒這種語法的
你看到的應該是類似這種吧
Route::get('/', function (IlluminateHttpRequest $request) {
});
這個是依賴注入
http://www.golaravel.com/lara...
下面是錯的:認真看了一下原始碼,答案是不是這樣?
在
這兩段程式碼之前,使用了
use IlluminateHttpRequest;
use只是使用了命名空間,但是要想呼叫類,必須載入類別檔案(require),或是自動載入。 ,lavavel使用的是自動加載,所以在我們看來use IlluminateHttpRequest後就相當於能直接用Request類,其實不是,使用Request類時laravel其實做了很多工作!
laravel的自動載入函數如下:
可以看出,如果你使用了一個未實例化的類別時,它會自動載入進來並且實例化。