如何扩展php类与其他字段交叉依赖原始字段?

时间:2017-08-24 15:11:22

标签: php calendar php-carbon

我试图扩展Carbon以包含Hebrew calendar上的等效日期(与标准Gregorian相对),以及其他相关信息。

这意味着一些额外的领域......

protected $hYear    
protected $hMonth
protected $hDay
...
(and more)

在这种情况下,Carbon $year$month$day现在依赖于$hYear$hMonth和{{1} }。 - 任何时候修改任何这些字段,都需要重新计算其他日历日期。必须保持格里高利和希伯来日期不匹配的实例。

我该如何做到这一点?

我尝试的第一件事是重写Carbon的创建方法,如果在前三个参数中传递的日期是希伯来语,则添加一个标志。除了非常丑陋($hDay)之外,我在静态上下文方面遇到了麻烦,我将解释:

在该场景中,调用create方法时有两个路径。如果传入英文日期,您需要制作碳实例,然后计算希伯来日期并在该实例中设置这些字段。如果您获得希伯来语日期,您将计算英语日期,然后创建实例,然后设置额外字段。但是,如何设置字段而不存在从静态上下文访问动态内容的问题? create(5777, 5, 8, null, null, null, null, true$instance->hYear无法正常工作,我制作的制作者抱怨静态内容。

我尝试的第二种方法是将转换代码放在构造函数中而不是create方法中,因此它将在每次创建时调用,并在静态上下文之外调用。这也存在一些问题。较小的一个是构造函数运行一次,因此修改方法也需要引用转换逻辑。我猜这不是世界末日。更大的问题是冗余:如果使用self::$hYear,那么构造函数将正确设置额外的字段。但是如果使用createFromDate(),它会将日期转换为英语以初始化Carbon实例,然后构造函数会将其转换回来。这是多余的冗余。

供参考,这里是Carbon's code

这是我到目前为止的代码:

createFromHebrewDate()

TLDR; 当我扩展一个类并向方法添加一个字段时,如何使用静态create方法修改它在创建之后创建的实例,然后再返回它?是否有更好的方法来强制执行交叉依赖,而不是复制每个Carbon的日期设置器并更改细节?

0 个答案:

没有答案