PHP中的靜態方法和非靜態方法調用方式再解

之前對靜態方法和非靜態方法的理解如下,比較籠統:

1. 靜態方法中不能調用非靜態方法

2. 非靜態方法的調用的方式爲:$obj->methodName();


今天在偶然測試時發現那樣說並不準確,更正如下:

1.非靜態方法[方法中不含$this字眼]的調用方式有self/className::methodName()和$obj->methodName();但非靜態

屬性是不能用className::propertyName,方式調用的.同理對象也不可以直接調用靜態屬性[靜態屬性屬於類,不屬於

某個具體對象](但java中是可以用對象調用靜態屬性的)

2. 靜態方法可以調用非靜態方法[方法中不含有$this字眼],調用方式爲self/className::methodName();

(注意使用條件哦!)

3. 另外:PHP中對象調不到靜態屬性(不會報錯),類不能用訪問靜態屬性的方式(::)訪問非靜態屬性,而對於方法的訪問

只要方法中不含$this ,就可以有(ClassName::unStaicMethod)($obj->staticMethod())

測試案例:

class Dog{
	private static $_instance = null;
	public static $count = 100;
	public $name = 'helo';

	public function test(){
		echo $this->name;
	}
	public function sayHello(){
		echo 'hello====';
	}
	public static function sayGood(){
		echo 'goods====';
		self::Singleton();
		return self::$_instance;
	}
	private static function Singleton(){
		self::sayHello(); //靜態方法中調用不含$this的非靜態方法 
		if(empty(self::$_instance)){
			self::$_instance = new self();
		}
		return self::$_instance;
	}
	public function getObj(){
		return self::Singleton();
	}
}
//靜態方法中不能調用方法中含有$this的非靜態方法
//Dog::sayHello(); // hello
//Dog::test(); // fatal error
//不能利用::直接調用非靜態屬性
//echo Dog::$name; //fatal error!
//調用非靜態方法+創建對象
//var_dump(Dog::getObj()); //hello====object(Dog)#1 (1) { ["name"]=> string(4) "helo" } 
//對象調用靜態屬性
$dog = new Dog();
//echo $dog->count; //靜態屬性不屬於特定對象,所以不會返回任何值,但java中可以調到。
var_dump($dog->sayGood()); // 對象可以調用不含$this 的靜態方法 //goods====hello====object(Dog)#2 (1) { ["name"]=> string(4) "helo" } 


注意對$this的理解,及腳本語言的動態加載,解釋執行,在java中,這種用法是堅決不允許的吧!


注:java中,對於屬性,對象可以訪問且能訪問到(.的方式)靜態屬性,但類不能訪問非靜態屬性;
        對於方法,類不可以訪問非靜態方法,對象則可以訪問靜態方法



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章