php類的靜態呼叫和範例化呼叫有哪些不同點?

2020-07-16 10:06:26

不同點有:1、靜態方法在程式開始時生成記憶體,實體方法在程式執行中生成記憶體;2、靜態方法可以直接呼叫,實體方法要先成生範例,通過範例呼叫方法;3、靜態的記憶體是連續的,範例申請的是離散的空間,所以沒有靜態方法快,靜態記憶體是有限制的。

靜態方法只有一個,無論你呼叫多少次,都是共用的,是沒有物件的概念,因此不能在靜態方法裡面使用$this呼叫,如果非得呼叫的話,只能範例化自身類

範例化不一樣,每一個範例化是一個物件,擁有多個。

下面用一個範例來了解一下

<?php
Error_reporting(E_ALL|E_STRICT);
 
class A{
    
    public function bar(){
        echo 'bar'.PHP_EOL;
    }
    public static function foo(){
        echo 'foo'.PHP_EOL;
    }
}
 
A::bar();//會報錯
A::foo();//正確
$obj = new A();
$obj -> foo();//正確
/* 
  bar()是一個非靜態方法,應該由物件來呼叫,但用靜態來呼叫此方法也可以執行,而嚴格狀態下,此方法會執行,同時報錯, 
  Strict Standards: Non-static method Human::easyeat() should not be called statically in........
  但是範例化的類是可以呼叫靜態方法的。
*/
<?php
 
class A{
    public $name = 'kangbazi';
 
    public function bar(){
        echo 'bar'.PHP_EOL;
    }
    public static function foo(){
        echo self::$name.PHP_EOL;//報錯
    }
}
 
A::foo();
 
/*
    靜態方法不能呼叫非靜態屬性 。不能使用self::呼叫非靜態屬性。
*/

做一個小總結:

最大的區別在於記憶體。

靜態方法在程式開始時生成記憶體,實體方法在程式執行中生成記憶體,

所以靜態方法可以直接呼叫,實體方法要先成生範例,通過範例呼叫方法,靜態速度很快,但是多了會佔記憶體。

任何語言都是對記憶體和磁碟的操作,至於是否物件導向,只是軟體層的問題,底層都是一樣的,只是實現方法不同。

靜態記憶體是連續的,因為是在程式開始時就生成了,而範例申請的是離散的空間,所以當然沒有靜態方法快,

而且靜態記憶體是有限制的,太多了程式會啟動不了。

以上就是php類的靜態呼叫和範例化呼叫有哪些不同點?的詳細內容,更多請關注TW511.COM其它相關文章!