3 回答

TA貢獻(xiàn)1906條經(jīng)驗(yàn) 獲得超10個(gè)贊
在PHP中聲明類常量或?qū)傩詴r(shí),只能為默認(rèn)值指定原始值。因此,例如,該類聲明將不起作用:
class TEST {
const ABC = 2 * 4;
const DEF = some_function();
static $GHI = array(
'key'=> 5 * 3,
);
}
但是該類聲明將:
class TEST {
const ABC = 8;
static $GHI = 15;
}
這些規(guī)則適用于類常量/屬性的默認(rèn)值 -您始終可以使用表達(dá)式的結(jié)果初始化其他變量:
$a= array(
'a'=> 1 * 2,
'b'=> 2 * 2,
'c'=> 3 * 2,
);
此類聲明行為的原因如下:表達(dá)式就像動(dòng)詞。他們做某事。類就像名詞:它們聲明某些東西。聲明性聲明絕不應(yīng)該產(chǎn)生動(dòng)作聲明的副作用。需要原始默認(rèn)值將強(qiáng)制執(zhí)行此規(guī)則。
考慮到這一點(diǎn),我們可以按以下方式重構(gòu)原始類:
class SDK
{
static protected $_types= null;
static public function getType($type_name) {
self::_init_types();
if (array_key_exists($type_name, self::$_types)) {
return self::$_types[$type_name];
} else {
throw new Exception("unknown type $type_name");
}
}
static protected function _init_types() {
if (!is_array(self::$_types)) {
self::$_types= array(
'STRING_NONE'=> 1 << 0,
// ... rest of the "constants" here
'STRING_HOSTS'=> 1 << 6
);
}
}
function __construct($fString = null) {
if (is_null($fString)) {
$fString= self::getType('STRING_NONE') & self::getType('STRING_HOSTS');
}
var_dump($fString);
}
}
$SDK &= new SDK(SDK::getType('STRING_HOSTS'));

TA貢獻(xiàn)1891條經(jīng)驗(yàn) 獲得超3個(gè)贊
PHP類屬性能不能在它的聲明中表達(dá)。
[...]該聲明可以包括一個(gè)初始化,但是此初始化必須是一個(gè)常量值-也就是說(shuō),它必須能夠在編譯時(shí)進(jìn)行評(píng)估,并且必須不依賴于運(yùn)行時(shí)信息才能進(jìn)行評(píng)估。[...]
資料來(lái)源:PHP手冊(cè):屬性
以下代碼可以正常工作,因?yàn)樗男畔⒖梢栽诰幾g時(shí)確定,并且不需要編譯器在其他任何地方查找,執(zhí)行任何數(shù)學(xué)或字符串函數(shù)來(lái)獲取信息。
class goodExample
{
// These are OK.
var $Var = 1;
const consts = 'I\'m a Constant Property of the class goodExample.';
static $static = array(FALSE, TRUE);
}
另一方面,以下內(nèi)容無(wú)效,因?yàn)楸仨毥馕銎渲挡拍塬@得其真實(shí)值。這一點(diǎn)在PHP中根本無(wú)效。在var $Var需要數(shù)學(xué)運(yùn)算。該const consts要求concations和varable仰望得到它的價(jià)值,這樣的兩個(gè)原因一個(gè)是行不通的。最后,該static屬性還$static需要進(jìn)行兩次數(shù)學(xué)運(yùn)算才能獲得其真實(shí)值。
class badExample
{
// These are NOT OK.
var $Var = 1 + 1;
const consts = "I'm a constant property of the class " . __CLASS__ . '.';
static $static = array((1 << 0), (1 << 2));
}
Consts和Static關(guān)鍵字
聲明這些屬性后,它們的值將無(wú)法更改。
const
[...]常量與普通變量的不同之處在于,您不使用$符號(hào)來(lái)聲明或使用它們。
該值必須是一個(gè)常量表達(dá)式,而不是(例如)變量,屬性,數(shù)學(xué)運(yùn)算結(jié)果或函數(shù)調(diào)用。
接口也可以具有常量。
資料來(lái)源:PHP手冊(cè):類常量
static
[...]將類屬性或方法聲明為靜態(tài)可以使它們無(wú)需類的實(shí)例化即可訪問(wèn)。實(shí)例化的類對(duì)象無(wú)法訪問(wèn)聲明為static的屬性(盡管可以使用static方法)。
資料來(lái)源:PHP手冊(cè):靜態(tài)關(guān)鍵字
Static 可以在類外部使用,只要您引用類名稱即可。

TA貢獻(xiàn)1825條經(jīng)驗(yàn) 獲得超4個(gè)贊
PHP之所以能夠做到(1 << 0)
這一點(diǎn),僅僅是因?yàn)槟谑褂?code>var時(shí)應(yīng)該使用const
。另外,這樣做self::VARIABLE
是針對(duì)靜態(tài)變量的,我相信應(yīng)該這樣做self::$variable
(除非您將它們定義為const
- 3 回答
- 0 關(guān)注
- 603 瀏覽
添加回答
舉報(bào)