關於PHP靜態方法調用和實例化類調用的區別


1.首先來澄清一些觀點

  由於靜態方法在內存中只有一份,無論你調用多少次,都是共用的,而且沒有對象的概念,所以不能在靜態方法里面使用$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 = 'zongshuai';

    public function bar(){
        echo 'bar'.PHP_EOL;
    }
    public static function foo(){
        echo self::$name.PHP_EOL;//報錯
    }
}

A::foo();

/*
    靜態方法不能調用非靜態屬性 。不能使用self::調用非靜態屬性。
*/

 

 

總結: 
類》訪問->靜態方法(類的方法)->可以
類》訪問->普通方法(對象的方法)->不可以(雖然方法里不用$this關鍵字時,可以!但不支持這種寫法)
對象》訪問》靜態方法(類的方法)->可以
對象》訪問》普通方法(對象的方法)->可以

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM