亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用簡單表達式初始化PHP類屬性聲明會產生語法錯誤

使用簡單表達式初始化PHP類屬性聲明會產生語法錯誤

PHP
UYOU 2019-11-04 14:30:08
根據PHP文檔,可以在具有以下限制的類中初始化屬性:“此聲明可以包括一個初始化,但是此初始化必須是一個常量值,也就是說,它必須能夠在編譯時進行評估,并且必須不依賴于運行時信息才能進行評估。”我正在嘗試初始化數組并遇到一些問題。雖然這可以正常工作:public $var = array(    1 => 4,    2 => 5,);這會產生語法錯誤:public $var = array(    1 => 4,    2 => (4+1),);甚至不被接受:public $var = 4+1;這表明它不是array()語言構造的限制?,F在,我最后一次檢查時,“ 4 + 1”等于一個常數值,不僅應該接受它,而且實際上應該對其進行優化。無論如何,它肯定可以在編譯時進行評估。那么這是怎么回事?相對于“能夠在編譯時求值”的任何表達式而言,限制是否真的沿“完全不能有任何計算出的表達式”的思路進行?在文檔語言中使用“求值”表示允許進行簡單的計算,但是a ...如果這是PHP中的錯誤,是否有人有錯誤ID?我試圖找到一個,但是沒有任何運氣。
查看完整描述

3 回答

?
慕蓋茨4494581

TA貢獻1850條經驗 獲得超11個贊

PHP在編譯時不執行此類操作;即使所有運算符本身都是常量,也不能將計算值分配給常量。類成員的默認值的處理方式完全相同。我在嘗試將2的冪分配給常量時遇到了這種現象:


class User {

    const IS_ADMIN = 1;

    const IS_MODERATOR1 = 1 << 1; // Won't work

    const IS_MODERATOR2 = 0x02;   // works

}


查看完整回答
反對 回復 2019-11-04
?
素胚勾勒不出你

TA貢獻1827條經驗 獲得超9個贊

從PHP 5.6開始,此限制不再存在

啟用先前不允許的語法的新功能稱為常量標量表達式:


現在可以提供涉及在PHP先前預期的靜態值的上下文,諸如常數和屬性的聲明和函數默認參數的數字和字符串文字和/或常數標量表達式。


class C {

    const THREE = TWO + 1;

    const ONE_THIRD = ONE / self::THREE;

    const SENTENCE = 'The value of THREE is '.self::THREE;


    public function f($a = ONE + self::THREE) {

        return $a;

    }

}


echo (new C)->f()."\n"; echo C::SENTENCE; ?>

上面的示例將輸出:


4 The value of THREE is 3


查看完整回答
反對 回復 2019-11-04
?
暮色呼如

TA貢獻1853條經驗 獲得超9個贊

在為此大手大笑之前,請考慮一下執行模型。在php通常用于(實際上是為php設計)的環境中,所有內容都被構建,執行,然后丟棄……直到下一個http請求進入。這沒有多大意義。浪費時間在解析/編譯階段進行計算。在一般情況下,發動機需要非常快。


但是,您是對的,該手冊中的引用確實說“評估”。也許您應該打開文件證明。


看來php現在將在php 5.6中支持常量標量表達式:


查看完整回答
反對 回復 2019-11-04
  • 3 回答
  • 0 關注
  • 378 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號