1

我正在定义一个具有 DateTime 对象作为属性之一的类。我想将其默认值设置为“-1”的 unix 时间戳。我还希望这个默认值保持不变,以便所有对象都知道它的值。

但我不想声明类似的东西,const PROPERTY_DEFAULT_DATE = '-1';因为该属性将是一个 DateTime 对象和使用此默认值的操作/函数,如果 PROPERTY_DEFAULT_DATE 不是正确的 DateTime 对象,该属性将难以处理

那么,我可以在另一个类中将一个类的特定对象实例作为常量吗?


PHP手册说

该值必须是常量表达式,而不是(例如)变量、属性、数学运算的结果或函数调用。

没有提到这一点,但我认为它无法完成(尝试了很多变体,总是出现语法错误)
如果不可能,我有什么替代方案?


编辑:我想我需要找到为我的属性定义“默认值”的问题的解决方案,在这种情况下,它恰好是一个 DateTime 对象。将在 中设置
什么默认值?(不,请不要为 NULL,我希望必须存在更优雅的解决方案)另外请记住,它可能用于类/子类中的操作/函数 __construct()
更新:我按照这里的建议private $_DEFAULT_DATE为它创建了一个属性和一个吸气剂。这个属性没有设置器,所以我可以保证它不会被改变。(当然,我注意不要在类实现中更改它)

4

4 回答 4

2

好吧,不幸的是,手册是正确的。您不能将对象放入常量中。您可以将其设为属性,或者在您的情况下,可能适合使用静态函数;

YourClass::getDefaultDate(); // return DateTime('-1');
于 2011-09-06T14:57:48.067 回答
1

这是不可能的。最简单的替代方法是使用静态属性,但听起来您想确保此属性不会更改。

因此,在这种情况下,唯一合乎逻辑的方法是将静态属性设为私有,并添加一个返回 DateTime 对象的静态函数。

但是,我仍然认为您不想使用单个对象。如果任何其他方法请求此默认对象,他们将能够修改它,您可能会得到奇怪的结果。对此方法的任何请求(在我看来)都应该收到一个新的或克隆的 DateTime 对象。

于 2011-09-06T14:58:57.740 回答
0

来自 php.net 关于sonstant 语法和使用 有人谈到了对常量的“动态”分配。什么?常量没有动态赋值,运行时赋值仅适用于变量。让我们举个例子:

<?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 或使用反射。但实际上我没有看到需要这个解决方案的问题。对不起 ((

于 2011-09-06T15:13:11.680 回答
0

该手册是正确的:不,您不能const在 PHP 的表达式中使用对象。

如果你想以这种方式使用它,你必须在构造函数中初始化一个适当的成员。如果你希望它是不可改变的,通过一定的努力你可以做到这一点

于 2011-09-06T14:57:24.543 回答