簡體   English   中英

類[DateTime('@-1')]的PHP對象實例在另一個類中為常量

[英]PHP object instance of class [DateTime('@-1')] as constant in another class

我正在定義一個具有DateTime對象作為屬性之一的類。 我想將其默認值設置為-1的unix時間戳。 我還希望此默認值是恆定值,以便所有對象都知道其值。

但是我不想聲明類似const PROPERTY_DEFAULT_DATE = '-1'; 因為該屬性將是一個DateTime對象以及使用該默認值的操作/函數,並且如果PROPERTY_DEFAULT_DATE不是正確的DateTime對象,則該屬性將難以處理

那么,我可以在另一個類中將某個類的特定對象實例作為常量嗎?


PHP手冊說

該值必須是一個常量表達式,而不是(例如)變量,屬性,數學運算結果或函數調用。

沒有提及,但是我認為這是不可能的(嘗試了很多變化,總是會出現語法錯誤)
如果不可能,我有什么選擇?


編輯:我想我需要找到對我的屬性定義“默認值”的問題的解決方案,在這種情況下碰巧是一個DateTime對象。
將在__construct()設置什么默認值? (不,請不要為NULL,我希望必須存在更優雅的解決方案)也請記住,它可能會用於類/子類中的操作/函數中
更新:我按照這里的建議,創建了一個private $_DEFAULT_DATE屬性和一個吸氣劑。 此屬性沒有設置器,因此可以確信它不會被更改。 (當然,我注意不要在類實現中更改它)

好吧,不幸的是,該手冊是正確的。 您不能將對象放入常量。 您可以將其設置為屬性,或者可以使用靜態函數;

YourClass::getDefaultDate(); // return DateTime('-1');

這是不可能的。 最簡單的選擇是使用靜態屬性,但這聽起來像您要確保此屬性不變。

因此,在這種情況下,唯一可行的方法是將靜態屬性設為私有,並添加一個返回DateTime對象的靜態函數。

但是,我仍然不希望您使用單個對象。 如果有任何其他方法請求此默認對象,他們將能夠對其進行修改,並且您可能會得到怪異的結果。 對這個方法的任何請求(在我看來)都應該收到一個新的或克隆的DateTime對象。

該手冊是正確的:不,您不能在PHP的const表達式中使用對象。

如果要以這種方式使用它,則必須在構造函數中初始化一個適當的成員。 如果您希望它不可更改, 那么您可以做出一些努力

來自php.net的有關常量語法和使用的信息有人談到了對常量的“動態”分配。 什么? 沒有對常量的動態分配,運行時分配僅適用於變量。 讓我們以建議的示例為例:

<?php 
/** 
 * Constants that deal only with the database 
 */ 
class DbConstant extends aClassConstant { 
    protected $host = 'localhost'; 
    protected $user = 'user'; 
    protected $password = 'pass'; 
    protected $database = 'db'; 
    protected $time; 
    function __construct() { 
        $this->time = time() + 1; // dynamic assignment 
    } 
} 
?> 

這些不是常量,而是類的屬性。 諸如“ this-> time = time()”之類的東西甚至會完全違反常量的目的。 常量應該在每次執行時就是常量值。 不應在每次運行腳本或實例化類時更改它們。

結論:不要嘗試將常量重新定義為變量。 如果常量不起作用,請使用變量。 然后,您不需要重新發明方法就可以實現已經存在的東西。

從自身出發:您可以使用私有靜態方法,也可以使用魔術方法__getStatic(因為僅從php 5.3起才有avaliablr),或者使用簡單的__get和property_exist或使用Reflection。 但是實際上我看不到需要此解決方案的問題。 對不起((

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM