2016-09-22 51 views
7

我有一個鍵值數據庫表,我存儲了一些設置。爲什麼PHP不能有一個常量對象?

我想將這些設置放在一個PHP常量對象中,因爲它們不應該是可編輯的。

在PHP7我們現在可以這樣做:

define('MySettings', array(
    'title' => 'My title' 
    // etc 
)); 

// And call it with 
echo MySettings['title']; 

而且它的偉大工程。

但爲什麼我不能做:

define('MySettings', (object) array('title' => 'My title')); 

所以,我可以這樣調用它來代替:

echo MySettings->title; 
// or 
echo MySettings::title; 

這僅僅是因爲我認爲這是更快,更漂亮些鍵入它作爲對象屬性/常量($obj->key,$obj::key),比數組($array['key']

是否有任何理由這是不可能的?

+7

因爲技術上的對象不能保持不變。它們可以包含代碼,這意味着對象的內部可以改變,這意味着它們不是常量。這就是爲什麼你有常數 - 這是一個承諾/保證你永遠不會改變常數。 –

+1

目前正在討論未來版本的PHP支持不可變對象的提議。這將允許程序使用一組值創建一個對象,並且一旦對象被創建,這些值將被修復並且不可更改。你可以在這裏閱讀更多關於它的信息:https://wiki.php.net/rfc/immutability。但請注意,它現在不在PHP中(7.0),它也不會在即將發佈的7.1版本中。根據討論的方式,它可能會達到7.2,但現階段對此做出承諾還爲時過早。 – Simba

回答

12

對於PHP,所有對象都是可變的。由於常量不應在運行時更改,但對象可以,因此目前不支持對象常量。

phpdoc about constants,它指出:

當使用const關鍵字,僅標量數據(布爾,整數, float和字符串)可以前PHP 5.6被包含在常量。從PHP5.6起,從 開始,可以將常量定義爲標量 表達式,並且還可以定義數組常量。可以將 定義爲一個資源,但應該避免,因爲它可能會導致意外的結果,所以應該避免使用 。

儘管存在數組不一致的問題,也沒有給出數組常量被允許的理由。 (我甚至認爲它是一個糟糕的電話。)它必須指出的是array-constants是不可改變的,因此,試圖從PHP7展示這段代碼來改變他們的致命錯誤的結果:

<?php 
$aNormalMutableArray = ['key' => 'original']; 
$aNormalMutableArray['key'] = 'changed'; 
echo $aNormalMutableArray['key']; 

define(
    'IMMUTABLE_ARRAY', 
    [ 
     'key' => 'original', 
    ] 
); 
IMMUTABLE_ARRAY['key'] = 'if I am an array, I change; if I am a constant I throw an error'; 
echo IMMUTABLE_ARRAY['key']; 

投擲:

PHP Fatal error: Cannot use temporary expression in write context 
in ~/wtf.php on line 12 

爲什麼不能用類似的錯誤定義對象常量?人們必須要問的是這種力量。

我建議遠離數組和對象作爲常量。而是創建一個不可變對象或使用immutable collections

既然您正在尋找特定的語法,那麼已經有class constants的概念。

<?php 
class MyClass 
{ 
    const CONSTANT = 'constant value'; 

    function showConstant() { 
     echo self::CONSTANT . "\n"; 
    } 
} 

echo MyClass::CONSTANT . "\n"; 

$classname = "MyClass"; 
echo $classname::CONSTANT . "\n"; // As of PHP 5.3.0 

$class = new MyClass(); 
$class->showConstant(); 

echo $class::CONSTANT."\n"; // As of PHP 5.3.0 

也可以在接口中定義它們。

+0

感謝您的回答。在類常量中,我必須對php文件中的所有常量進行「硬編碼」,但是我想使它變爲動態的,所以當我在數據庫設置表中創建新行時,它可以作爲設置使用。但這對於類常量是不可能的。如果它是有道理的。這就是我使用常量數組的原因。 – JemoeE

+0

@ user245734雖然讚賞,評論並不意味着感謝你。這是足夠的upvote或接受一個答案:) – k0pernikus

+0

@ user245734並根據您的後續問題,以避免硬編碼所有的常量:這是一個後續問題,並不完全在您的原始問題的範圍。隨意打開一個新的問題。 – k0pernikus

相關問題