⑴ php 類中的static有什麼作用
static 是C中很常用的修飾符,它被用來控制變數的存儲方式和可見性
static 聲明的變數在C語言中有兩方面的特徵:
1)、變數會被放在程序的全局存儲區中,這樣可以在下一次調用的時候還可以保持原來的賦值。這一點是它與堆棧變數和堆變數的區別。
2)、變數用static告知編譯器,自己僅僅在變數的作用范圍內可見。這一點是它與全局變數的區別。
2、問題:Static的理解
關於static變數,請選擇下面所有說法正確的內容:
A、若全局變數僅在單個C文件中訪問,則可以將這個變數修改為靜態全局變數,以降低模塊間的耦合度;
B、若全局變數僅由單個函數訪問,則可以將這個變數改為該函數的靜態局部變數,以降低模塊間的耦合度;
C、設計和使用訪問動態全局變數、靜態全局變數、靜態局部變數的函數時,需要考慮重入問題;
D、靜態全局變數過大,可那會導致堆棧溢出。
答案與分析:
對於A,B:根據本篇概述部分的說明b),我們知道,A,B都是正確的。
對於C:根據本篇概述部分的說明a),我們知道,C是正確的(所謂的函數重入問題,下面會詳細闡述)。
對於D:靜態變數放在程序的全局數據區,而不是在堆棧中分配,所以不可能導致堆棧溢出,D是錯誤的。
因此,答案是A、B、C。
3、問題:不可重入函數
曾經設計過如下一個函數,在代碼檢視的時候被提醒有bug,因為這個函數是不可重入的,為什麼?
unsigned int sum_int( unsigned int base )
{
unsigned int index;
static unsigned int sum = 0; // 注意,是static類型的。
for (index = 1; index <= base; index++)
{
sum += index;
}
return sum;
}
答案與分析:
所謂的函數是可重入的(也可以說是可預測的),即:只要輸入數據相同就應產生相同的輸出。
這個函數之所以是不可預測的,就是因為函數中使用了static變數,因為static變數的特徵,這樣的函數被稱為:帶「內部存儲器」功能的的函數。因此如果我們需要一個可重入的函數,那麼,我們一定要避免函數中使用static變數,這種函數中的static變數,使用原則是,能不用盡量不用。
將上面的函數修改為可重入的函數很簡單,只要將聲明sum變數中的static關鍵字去掉,變數sum即變為一個auto 類型的變數,函數即變為一個可重入的函數。
當然,有些時候,在函數中是必須要使用static變數的,比如當某函數的返回值為指針類型時,則必須是static的局部變數的地址作為返回值,若為auto類型,則返回為錯指針。
⑵ php靜態屬性跟常量有什麼區別啊
類的靜態屬性. 會在類文件載入的時候, 就初始化.
屬性值是可以更改的.
常量...一旦定義了. 就無法變更值..
這應該算是最大區別.
另外, 常量只能是簡單的數據類型(如: int , string , boolean,float , double) ,
類的靜態屬性, 可以是php所支持的任意變數類型(但初始化的時候. 只能是簡單數據類型, 數組)
⑶ 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 中class static public var 都定義什麼什麼
static 一旦聲明為靜態變數,在編譯時刻開始永遠存在,不受作用域范圍約束,而且展一定內存
public 公共的誰都可以調用。
var 跟public 一樣。var是老版本php的寫法。
<?php
class a{
var $abc="ABC";
}
$b=new a;
$c=$b;
echo $b->abc;//這里輸出ABC
echo $c->abc;//這里輸出ABC $b->abc="DEF";
echo $c->abc;//這里輸出DEF
?>
這個就是php $b引用類a的方法的變數。
引用方法是 類名:: 方法名。好了200分拿出來吧
⑸ PHP中this,self和static的區別
PHP支持類和面向對象結構,PHP的類的靜態函數和變數不與任何特定類的實例相關聯(換句話說,一個對象)。
相反,靜態函數和變數與類定義本身相關聯。換言之,一個類的所有實例都共享相同的靜態變數。在一個類的方法(函數)的上下文中,靜態變數和函數被訪問使用self::,在一個類的對象(實例)的上下文中使用其他方法和變數時用this。
靜態函數只能使用靜態變數,靜態函數和變數的引用是通過 self::函數名() 和 self::變數名。上述實例中,靜態變數的引用是由類名(exampleClass::$foo),或者self::(self::$foo),當在這個類的靜態方法[稱為 靜態函數()]里使用時。類的正則函數和變數需要一個對象上下文來引用,他們不能脫離對象上下文而存在。對象上下文由$this提供。在上述函數中,$bar 是一個正則變數,所以它被 $obj->bar(上下文使用變數obj) 來引用,或者使用 $this->bar(再次在一個對象的方法里在一個對象上下文中) 來引用。
self 不使用前面的 $,因為 self 不意味著是一個變數而是類結構本身。而 $this 引用一個特定的變數,所以有前面的 $ 。
⑹ php靜態屬性和常量的區別,求教
介面:
1 不能夠定義靜態變數在類的 成員變數(常量除外)
2 定義的常量 const YOUCONST = VALUE,不能在子類中覆蓋,在子類中以 interfaceName::YOUCONST的方式調用
3 不能使用parent::YOUCONST的方式調用介面的常量
類:
1 const 變數可以使用parent::YOUCONST的方式,className::YOUCONST的方式在子類中訪問
2 const定義的變數,在子類中可以被覆蓋
3 當然在類中可以定義靜態成員變數了
⑺ php類中有靜態方法和非靜態的,我想問的是,什麼時候用靜態方法,靜態方法和普通方法有什麼不同
php類中的靜態方法和非靜態方法,跟一般我們所說OOP編程中的用法不盡相同,有些特性是不完善的,但你可以當它們是正規OOP的類來使用。
⑻ php 在類中怎麼定義靜態變數
<?php
class testClass
{
static $staticvar='hello php';
function getValue(){
return self::$staticvar;
}
}
⑼ PHP中的靜態類是怎麼實現的啊
首先:類不可以標注static,也就是說沒有「靜態類「!
所謂"靜態類"指的是:類中含有靜態的成員、方法是用static標注的。寫法例如:
<?php
classMath
{
publicstaticfunctionceil($value)
{
returnceil($value);
}
publicstaticfunctionfloor($value)
{
returnfloor($value);
}
}
?>
另外類種的靜態方法無需實例化成對象即可使用哦,實例化會報錯哦;
⑽ php的靜態變數究竟有什麼作用
一、靜態變數具有這樣的特性:
當在某函數里定義一個靜態變數後,這個變數不會即使函數退出了,在下次調用這個函數時,它會使用前次被調用後留下的值。
此外,雖然該變數不隨函數的退出而繼續存在,但函數的外部並不能使用它。
因此,靜態變數的應用時機如下:
當多次調用一個函數,且要求在調用之間保留某些變數的值時,可考慮採用靜態局部變數。
雖然用全局變數也可以達到上述目的,但全局變數有時會造成意外的副作用,因此仍以採用局部靜態變數為宜。
以下是某應用中的示例代碼:
<?PHP
functionTest()
{
static$count=0;
$count++;
echo$count;
if($count<10){
Test();
}
$count--;
}
?>
二、對於類中定義的靜態變數來說,簡單點說,類的靜態成員可以不用實例化而直接使用。