Ⅰ php靜態方法 什麼時候使用
是在編譯的時候,動態類是在程序運行的時候動態分配的
Ⅱ 靜態方法 有什麼優缺點 PHP中靜態方法(s
static方法是類中的一個成員方法,屬於整個類,即使不用創建任何對象也可以直接調用!
靜態方法效率上要比實例化高,靜態方法的缺點是不自動進行銷毀,而實例化的則可以做銷毀。
靜態方法和靜態變數創建後始終使用同一塊內存,而使用實例的方式會創建多個內存。
C++中,若類的方法前加了static關鍵字,則該方法稱為靜態方法,反之為實例方法。靜態方法為類所有,可以通過對象來使用,也可以通過類來使用。但一般提倡通過類名來使用,因為靜態方法只要定義了類,不必建立類的實例就可使用。靜態方法只能用類的靜態成員。
Ⅲ 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關鍵字時,可以!但不支持這種寫法)
對象》訪問》靜態方法(類的方法)->可以
對象》訪問》普通方法(對象的方法)->可以
*/
?>
Ⅳ php靜態方法有什麼好處,什麼時候會用啊
static關鍵字用來修飾屬性、方法,稱這些屬性、方法為靜態屬性、靜態方法。
static關鍵字聲明一個屬性或方法是和類相關的,而不是和類的某個特定的實例相關,因此,這類屬性或方法也稱為「類屬性」或「類方法」,如果訪問控制許可權允許,可不必創建該類對象而直接使用類名加兩個冒號「::」調用。
static關鍵字可以用來修飾變數、方法。
不經過實例化,就可以直接訪問類中static的屬性和static的方法。
static 的屬性和方法,只能訪問static的屬性和方法,不能類訪問非靜態的屬性和方法。因為靜態屬性和方法被創建時,可能還沒有任何這個類的實例可以被調用。
static的屬性,在內存中只有一份,為所有的實例共用。
使用self:: 關鍵字訪問當前類的靜態成員。一個類的所有實例,共用類中的靜態屬性。也就是說,在內存中即使有多個實例,靜態的屬性也只有一份。
靜態屬性直接調用 靜態屬性不需要實例化就可以直接使用,在類還沒有創建時就可以直接使用。
Ⅳ php的DB類使用靜態方法有什麼好處
靜態方法用於不需要實例化的情況,通俗來講一個類是數據和操作該數據的方法的集合,很多類的具體數據有時候是根據不同的實例有不同的值的,這個時候使用這個類就要實例化,要先new 一個對象出來,再對該對象進行操作。這個類就是非靜態的,因為類數據是變化的。
但也有些類的數據是固定不變的,也就是說實例化有否不影響數據,那麼這個時候就可以直接調用這個類,這個類就可以定義為靜態。這個時候調用靜態方法時就不需要new一個對象了,而是直接調用類。
Ⅵ php 使用靜態方法的幾個注意事項說明
1.即使類中的方法並未用static聲明,但其未使用到可改變的類成員變數,在外部仍可用操作符::來調用;
2.以靜態方式(用::操作符)調用的方法中$this的取值是由調用時的上下文決定的!而不是定義他的類!!
例如以下的代碼:
<?php
classTestClass1
{
public$normal_v='normal_vfromTestClass1';
publicstatic$STATIC_V='STATIC_VfromTestClass1';
publicfunctiontest_func1()
{
echo$this->normal_v.'<br/>'.self::$STATIC_V;
}
}
classTestClass2
{
public$normal_v='normal_vfromTestClass2';
publicstatic$STATIC_V='STATIC_VfromTestClass2';
publicfunctiontest_func2()
{
TestClass1::test_func1();
}
}
$t2=newTestClass2();
$t2->test_func2();
這段代碼是輸出會是什麼呢,我原以為會是normal_v from TestClass1 <br /> STATIC_V from TestClass1,測試發現其實我錯了,正確的輸出是:
normal_v from TestClass2
STATIC_V from TestClass1
說明:test_func1()雖然是在TestClass1中定義的,但卻是在TestClass2中調用的,其內部的$this變數則是由TestClass2決定的!
其實這兩個類的關系應該屬於"雙向關聯".
Ⅶ PHP靜態方法和非靜態方法的區別
靜態方法必須使用static關鍵字聲明,面向對象編程中我們通常通過類的實例(而不是類的本身)來調用類,類其實是對象的模板,但是靜態方法區別於普通類,它不僅可以通過類的實例來調用,還可以通過類來訪問他們,比如 Game::getGame(); 使用類調用的時候使用::,在當前類調用還可以使用self關鍵字,比如 self::getGame(); 靜態方法是以類為作用域,不能訪問類中的普通屬性,因為他們屬於一個對象,但可以訪問靜態屬性。不知道你明白了沒有
Ⅷ php面向對象 的static在什麼情況下用
靜態變數,沒有什麼特定的情況。就像public一樣,只不過調用方法不一樣。一個是$this->變數名,一個是self::變數名
Ⅸ 什麼時候要用靜態方法
靜態方法何時使用
如果某些操作不依賴具體實例,那它就是靜態的,反之如果某些操作是依賴具體實例的(例如訪問一個特定會員的名稱),那它就應該是實例化的。
靜態方法不用new對象可以直接調用
1.與類相關與對象無關
2.不需要對象的「輕」方法
3.工廠方法
如果某個方法是用頻率較高,或者方法本身通用性較強,無需初始化類成員變數,則可以使用靜態方法,那樣方便,速度也快.
可以直接拿來就用的方法,就算是靜態的.
肯定不涉及具體對象,因為靜態方法內,是無法直接使用任何非靜態成員的。
(1)製作工具類
(2)可以當作"作局"對象或方法來使用
靜態方法和實例方法是一樣的,在類型第一次被使用時載入。調用的速度基本上沒有差別。
靜態方法不用創建實例就可調用,比較簡單從面向對象的角度上來說,在抉擇使用實例化方法或靜態方法時,應該根據是否該方法和實例化對象具有邏輯上的相關性,如果是就應該使用實例化對象 反之使用靜態方法
不需要生成對象的
經常頻繁使用的
工具類里的(如SqlHelper)
適當地使用static方法本身並沒有什麼,當一個人從來不懂使用多態、介面設計時,很自然地會濫用static方法。
個人理解在多個類中需要調用並且是與對象無關的方法可設為靜態方法,方便調用。
所有對象共有的方法
再不關繫到任何於特定對象相關的操作
比如學生的年齡就是學生的相關。
修改學生的年齡就不適合用靜態方法。
一般來說,如果你的方法里沒有用到this關鍵字,
那就適合用靜態方法
通常通用的類中一些常用的方法可以設計為靜態類
只要是沒有用到類的狀態信息,只從參數獲取信息的都可以為靜態的
可以實現某些特殊的設計模式:如Singleton
由於沒有this指針,可以把某些系統API的回調函數以靜態函數的形式封裝到類的內部
可以封裝某些演算法,比如數學函數,如ln,sin,tan等等,這些函數本就沒必要屬於任何一個對象,所以從類上調用感覺更好
總之,從OOA/OOD的角度考慮,一切不需要實例化就可以有確定行為方式的函數都應該設計成靜態的
靜態方法與非靜態方法最明顯的區別就是如果某個方法是公共靜態的,那麼可以直接通過類名.方法名的方法來調用,而公共實例方法則需要事先實例化對象,然後才能調用。
這些各種說法,基本上都是正確的。
Ⅹ 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::..
的方法調用,如之前所述