类 [DateTime('@-1')] 的 PHP 对象实例在另一个类中作为常量

Posted

技术标签:

【中文标题】类 [DateTime(\'@-1\')] 的 PHP 对象实例在另一个类中作为常量【英文标题】:PHP object instance of class [DateTime('@-1')] as constant in another class类 [DateTime('@-1')] 的 PHP 对象实例在另一个类中作为常量 【发布时间】:2011-11-11 10:02:51 【问题描述】:

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

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

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


php 手册说

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

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


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

【问题讨论】:

顺便说一句,但是您是使用 PHP 的 DateTime 类还是自己编写?我很确定(但我可能是错的) DateTime 不会让你将它设置为 unix timestamp=-1。 也许你错了,试试$nullDate = new DateTime('@-1');还是我使用 @ 来抑制警告/错误? 您正在抑制错误,您实际上不需要这样做,因为 DateTime 会自动执行此操作。我检查了我的假设,我是正确的:-1 是非法值。试试下面的 - $d=new DateTime();//now $u=new DateTime('-1');//ignores the illegal value and returns new DateTime(), ie now $u1=date_create('-1');//ignores the illegal value and returns new DateTime(), ie now $u2=date_create_from_format('U',0);//time=0 $u3=date_create_from_format('U',-1); //returns false 我正在使用 PHP5.3 ,我没有收到任何错误,我得到的时间戳为 -1,即 (unix epoch - 1 second )。即使我离开@,我也会得到相同的结果。此外,@ 在引号内,即它是传递给 DateTime 的字符串参数的一部分。我认为 DateTime 需要以 @ 开头的参数作为 unix 时间戳(如果传递整数,它会引发错误,请尝试 new DateTime(32)new DateTime('32'))但是如果你将它附加到 @ ,参数现在是一个字符串,但 DateTime 创建对象dateTime = @ 之后的时间戳值 【参考方案1】:

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

如果你想以这种方式使用它,你必须在构造函数中初始化一个适当的成员。如果您希望它不可更改,with certain effort you can make it so。

【讨论】:

【参考方案2】:

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

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

【讨论】:

【参考方案3】:

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

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

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

【讨论】:

hmm,如果您要使用 DateTime 对象作为属性,会将其设置为 __construct() 中的什么值? @Sudhi:PHP 的 DateTime 类默认为现在正在构建。 是的,我知道。但是您宁愿将其设置为 now() 还是其他? DateTime('0000-00-00 00:00:00') 产生奇怪的结果,在这种情况下尝试 DateTime('@-1') 不起作用。我想知道它是否更多的是约定问题而不是标准化问题【参考方案4】:

来自 php.net about sonstant syntax and use 有人谈到常量的“动态”分配。什么?没有对常量的动态赋值,运行时赋值与变量一起工作。让我们举个例子:

<?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()”这样的东西甚至会完全违背常数的目的。在每次执行时,常量都应该是常量值。每次脚本运行或实例化类时,它们不应该更改。

结论:不要试图将常量重新定义为变量。如果常量不起作用,只需使用变量。那么你不需要重新发明方法来实现已经存在的东西。

来自self:您可以使用私有静态方法和魔术方法__getStatic(因为它仅来自php 5.3 的avaliablr)或使用简单的__get 和property_exist 或使用反射。但实际上我没有看到需要这个解决方案的问题。对不起((

【讨论】:

am 定义了一个常量:'-1',但在 unix timestamp 的上下文中。那么它不是一个常数吗? 如果我有,我不会问这个问题。当我说 constant 时,我指的是属性/属性的价值。它永远不会改变。正如文字'-1'和 int 在任何语言/代码中都是相同的(因此是一个常量),我希望'-1'作为常量:但在 unix 时间戳的上下文中(如 1969-12-31 23 :59:59 +00:00) 。我也使用 '0' (所以我得到了 unix epoch),但重点是,它在时间轴上是一个明确且恒定的标记。

以上是关于类 [DateTime('@-1')] 的 PHP 对象实例在另一个类中作为常量的主要内容,如果未能解决你的问题,请参考以下文章

PHP DateTime 类命名空间

PHP 时间日期处理类

PHP:strftime()、date() 或 DateTime,哪个更好?

在 SQL 中使用 PHP 为 DATETIME 转换日期

PHP 5.2 的 DateTime::diff() 有啥用?

datetime模块