首頁 >後端開發 >PHP問題 >php類別的靜態呼叫和實例化呼叫有哪些不同點?

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

烟雨青岚
烟雨青岚原創
2020-06-30 15:58:383423瀏覽

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

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

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

實例化不一樣,每一個實例化是一個對象,擁有多個。

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

<?php
Error_reporting(E_ALL|E_STRICT);
 
class A{
    
    public function bar(){
        echo &#39;bar&#39;.PHP_EOL;
    }
    public static function foo(){
        echo &#39;foo&#39;.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 = &#39;kangbazi&#39;;
 
    public function bar(){
        echo &#39;bar&#39;.PHP_EOL;
    }
    public static function foo(){
        echo self::$name.PHP_EOL;//报错
    }
}
 
A::foo();
 
/*
    静态方法不能调用非静态属性 。不能使用self::调用非静态属性。
*/

做一個小總結:

最大的差異在於記憶體。

靜態方法在程式開始時產生記憶體,實例方法在程式運行中產生內存,

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

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

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

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

推薦教學:《php教學

以上是php類別的靜態呼叫和實例化呼叫有哪些不同點?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn