我是一個菜鳥新手,我發現很多工具類,直接聲明就能用了,例如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中文网2017-05-16 13:12:23
php沒這種語法的
你看到的應該是類似這種吧
Route::get('/', function (IlluminateHttpRequest $request) {
return view('welcome', ['a'=>$request->get('a',1)]);
});
這個是依賴注入
http://www.golaravel.com/lara...
过去多啦不再A梦2017-05-16 13:12:23
下面是錯的:認真看了一下原始碼,答案是不是這樣?
在
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;
}
}
可以看出,如果你使用了一個未實例化的類別時,它會自動載入進來並且實例化。