在學習php物件導向的時候,遇到了一些問題:
class
test1
}
在test1類中,定義了乙個test方法。一般呢,想要呼叫test方法的話,是通過例項化乙個物件來呼叫test方法的。比如:
aaa.php:
<?
php
//正常的方式訪問普通方法test
class
test1
}
$new
=new
test1
();
$new
->
test
();
但是呢,由於失誤寫錯了,並沒有例項化而是通過訪問靜態方法來呼叫test方法,比如:
bbb.php:
<?
php
//訪問靜態方法的方式訪問普通方法test
class
test1
}
test1
::test
();
然後發現是可以正常呼叫test方法的。然後通過查閱資料發現:
其實,非靜態方法,是不能由類名靜態呼叫的,但目前,php中的物件導向檢測不夠嚴格,只要非靜態方法中沒有$this關鍵字,就會轉化成靜態方法來處理!
也就是說,上面的test1::test();其實會被轉化為:
$new
=new
test1
();
$new
->
test
();
這樣呢,就有另外乙個問題了,如果是乙個靜態方法,然後通過訪問普通方法的方式通過例項化乙個物件來訪問這個靜態方法是否可行呢?比如:
classtest2
}
對於test2類裡面的靜態方法test的呼叫呢,一般呢,是通過直接test2::test();來呼叫的。比如:
ccc.php:
<?
php
//訪問靜態方法的方式訪問普通方法test
class
test1
}
test1
::test
();
使用訪問普通方法的方式去呼叫:
ddd.php:
<?
php
//通過例項化的方式訪問靜態方法test
class
test2
}
$new
=new
test2
();
$new
->
test
();
發現,也是可以正常顯示出來的。
總結:雖然兩者都可以互相呼叫,但是最好還是建議規範化。
posted @
2016-05-22 16:07
newman·li 閱讀(
...)
編輯收藏
靜態和非靜態方法 呼叫靜態和非靜態方法 原創
在學習php物件導向的時候,遇到了一些問題 class test1 在test1類中,定義了乙個test方法。一般呢,想要呼叫test方法的話,是通過例項化乙個物件來呼叫test方法的。比如 aaa.php php 正常的方式訪問普通方法test class test1 new new test1 ...
靜態和非靜態方法
一步一步了解基礎知識 直觀上 靜態方式有static修飾符,非靜態方法沒有。一 靜態成員和非靜態成員區別 靜態成員屬於類所有,而非靜態成員屬於類的例項所有。非靜態成員 每當建立乙個類的例項,就會給非靜態成員在記憶體中開闢一塊儲存空間。靜態成員 無論建立多少類的例項,類的靜態成員只在記憶體中佔同一區域...
靜態函式和非靜態函式的區別(靜態方法和非靜態方法)
首先,靜態函式 只有當程式結束的時候才從記憶體消失,生命週期長。而非靜態則是動態載入到記憶體,不需要的時候就從記憶體消失。而呼叫類中的靜態函式,無需建立物件就可以呼叫了,因為當類初始化的時候,就已經載入了靜態函式,所以靜態函式要比物件載入的早,物件只有被建立的時候才會在堆記憶體中建立空間。另外,靜態...