搜尋

首頁  >  問答  >  主體

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()就是一個非靜態方法!

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

習慣沉默習慣沉默2780 天前492

全部回覆(2)我來回復

  • PHP中文网

    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...

    回覆
    0
  • 过去多啦不再A梦

    过去多啦不再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;
        }
    }
    

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

    回覆
    0
  • 取消回覆