本文目錄一覽:
- 1、php”直接用類名”和”new實例化”調用函數哪種方法效率更高?
- 2、php靜態方法和實例方法的區別
- 3、類中靜態方法和實例方法的區別
- 4、PHP類的靜態(static)方法和靜態(static)變量使用介紹
- 5、關於PHP靜態方法調用和實例化類調用的區別
- 6、PHP中靜態方法和實例化方法的區別
php”直接用類名”和”new實例化”調用函數哪種方法效率更高?
1.首先用法不同,__new__()用於創建實例,所以該方法是在實例創建之前被調用,它是類級別的方法,是個靜態方法;
而 __init__() 用於初始化實例,所以該方法是在實例對象創建後被調用,它是實例級別的方法,用於設置對象屬性的一些初始值。
由此可知,__new__()在__init__() 之前被調用。如果__new__() 創建的是當前類的實例,會自動調用__init__()函數,通過return調用的__new__()的參數cls來保證是當前類實例,如果是其他類的類名,那麼創建返回的是其他類實例,就不會調用當前類的__init__()函數。
2.其次傳入參數不同
__new__()至少有一個參數cls,代表當前類,此參數在實例化時由Python解釋器自動識別;
__init__()至少有一個參數self,就是這個__new__()返回的實例,__init__()在__new__()的基礎上完成一些初始化的操作。
3.返回值不同
__new__()必須有返回值,返回實例對象;
__init__()不需要返回值。
另外談談__new__()的作用,__new__()方法主要用於繼承一些不可變的class,比如int, str, tuple, 提供一個自定義這些類的實例化過程的途徑,一般通過重載__new__()方法來實現。代碼如下
另外__new__()方法還可以用來實現單例模式,也就是使每次實例化時只返回同一個實例對象。
php靜態方法和實例方法的區別
?php
header(‘content-type:text/html;charset=utf-8’);
/*
普通方法,存放類內,只有一份
靜態方法,也是存放於類內,只有一份
區別在於:普通方法需要對象去調用,需要綁定$this
即,普通方法,必須要有對象,然後讓對象來調用
而靜態方法,不屬於哪一個對象,因此不需要綁定$this
即,不需要對象也可以調用
*/
class Human{
static public $head=1;
public function easyeat(){
echo ‘普通方法吃飯br /’;
}
static public function eat(){
echo ‘靜態方法吃飯br /’;
}
public function intro(){
echo $this-name;
}
}
Error_reporting(E_ALL|E_STRICT);
//此時沒有對象!方法可以執行
Human::eat();
/*
以下方法easyeat是一個非靜態方法,就由對象來調用,但,用類來調用此方法來也可以執行,而嚴格狀態下,此方法會執行,同時報錯,
Strict Standards: Non-static method Human::easyeat() should not be called statically in D:\application\PHPnow-1.5.6\htdocs\yan18\types\staticfun.php on line 32
*/
Human::easyeat();
/*
接上,從邏輯來理解,如果用類名靜態調用非靜態(普通)方法
比如:intro()
那麼,這個$this是指哪個對象呢??
因此會報錯,因為找不到對象!
Fatal error: Using $this when not in object context in D:\application\PHPnow-1.5.6\htdocs\yan18\types\staticfun.php on line 23
*/
Human::intro();
/*
如上分析,其實,非靜態方法,是不能由類名靜態調用的,但目前,php中的面向對象檢測不夠嚴格,只要靜態方法中沒有$this關鍵字,就會轉化成靜態方法來處理!
*/
$li=new Human();
$li-eat();
/*
總結:
類》訪問-靜態方法(類的方法)-可以
類》訪問-普通方法(對象的方法)-不可以(雖然方法里不用$this關鍵字時,可以!但不支持這種寫法)
對象》訪問》靜態方法(類的方法)-可以
對象》訪問》普通方法(對象的方法)-可以
*/
?
類中靜態方法和實例方法的區別
1、調用方式上
靜態方法依賴於類,通過類.靜態方法調用;實例方法依賴於類的對象,需要創建對象後,對象.實例方法使用
2、使用上
實例方法內部不能定義靜態變量,會出現編譯錯誤;實例方法可以直接調用靜態方法;靜態方法內部可以定義和使用實例變量,靜態方法無法直接調用實例方法(因靜態方法加載時類還沒有實例化,實例方法依賴於類的對象)
3、靜態方法和實例方法的內存分配問題
一般認為靜態方法常駐內存,實例方法只有在使用時才分配內存。但事實上,是一樣的,都是在類被加載時常駐內存。static方法和non-static方法在創建實例對象時,屬性的值對各個對象各不相同(每個實例對象的所有字段在內存中有一個拷貝,用於區分操作哪個對象的字段),new一個實例時,會把實例屬性放在GC Heap裏面,同時new的對象放在堆棧上,堆棧指針指向剛才拷貝的的內存地址;而靜態方法中的靜態字段只有一份;對於static和non-static方法代碼都是一樣的,所以只需要一份代碼,佔用一份內存空間。調用速度上因實例方法需要實例化分配內存,靜態方法則不用,故靜態方法會快一點,但也可忽略不計
4、區分靜態方法和實例方法的原因
早期結構化編程幾乎所有方法都是靜態方法,引入實例化方法的概念是在面向對象概念出現以後,區分靜態方法和實例方法不能單單從性能上理解。創建c++、java、c#這樣面向對象語言的大師引入實例化方法一定不是要解決什麼性能、內存的問題,而是為了讓開發更加模式化、面向對象化。這樣說的話,靜態方法和實例化方式的區分是為了解決模式的問題
5、適用場景
靜態方法:一個方法與類的對象無關,如工具類等
實例方法:一個方法依賴於類的對象;多線程場景下,如果靜態方法中含有靜態變量,如果對靜態變量進行更改操作易造成線程安全問題
6、靜態方法與單例模式
如果一個方法與對象的實例無關用靜態方法,反之採用實例方法,但如果方法和對象的實例有關,又想維護一份實例時,需要用單例模式。如系統運行時,需要加載一些的配置和屬性,是公共的,需要在整個生命周期存在,只需要一份就可以,但此時這些配置和屬性又是通過面向對象的編碼方式得到的,雖然用靜態方法也能解決,但最好的方式是採用單例模式
PHP類的靜態(static)方法和靜態(static)變量使用介紹
在php中,訪問類的方法/變量有兩種方法:
1.
創建對象$object
=
new
Class(),然後使用」-」調用:$object-attribute/function,前提是該變量/方法可訪問。
2.
直接調用類方法/變量:class::attribute/function,無論是靜態/非靜態都可以。但是有前提條件:
A.
如果是變量,需要該變量可訪問。
B.
如果是方法,除了該方法可訪問外,還需要滿足:
b1)
如果是靜態方法,沒有特殊條件;
b2)
如果是非靜態方法,需要改方法中沒有使用$this,即沒有調用非靜態的變量/方法,當然,調用靜態的變量/方法沒有問題。
然後我們再看一下使用$object-…
和使用class::…
都有什麼區別:
1.
使用$object-…
,需要執行構造函數創建對象;
2.
使用class::…
調用靜態方法/變量,不需要執行構造函數創建對象;
3.
使用class::…
調用非靜態方法/變量,也不需要執行構造函數創建對象。
然後奇怪的地方就出來了,既然2和3都一樣,那靜態方法/變量存在還有什麼意義呢?
差異還是顯然存在的,如下:
1.
靜態變量
靜態成員只保留一個變量值,而這個變量值對所有的實例都是有效,也就是說,所有的實例共享這個成員。
2.
靜態方法
靜態方法可以直接使用class::…
來調用,而非靜態方法需要滿足一定限制條件才能使用class::..
的方法調用,如之前所述
關於PHP靜態方法調用和實例化類調用的區別
php一般是實例化 一般都是string 類型的。其實從你賦值或者聲明的時候就已經算是實例化了如果你想給她轉換類型需要在前面加(int)string 可以不用。其他的需要 。注意就算你$a=12345;他一樣給你判定是string只有$a=(int)1234;才可以
PHP中靜態方法和實例化方法的區別
當用::
使用方法是被認為該方法為靜態方法,
靜態方法中不允許使用$this,
因為靜態方法的調用不需要實例化,
而$this是實例化後才出現的,
所以靜態方法類似於一個普通的函數
靜態方法
是加栽到內存.而且還少了
NEW
的內存空間.速度相對快一點效率好點。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/252139.html