Heim > Fragen und Antworten > Hauptteil
我是一个菜鸟新手,我发现很多工具类,直接声明就能用了,例如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 Illuminate\Http\Request;
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;
}
}
可以看出,如果你使用了一个未实例化的类时,它会自动加载进来并且实例化。