gpt4 book ai didi

php - 在外观中定义类常量

转载 作者:可可西里 更新时间:2023-11-01 13:00:05 26 4
gpt4 key购买 nike

我为我的 Laravel 应用程序定义了几个公开常量的库。

比如我有一个计算节假日和工作日的类,用于统计一些报表的工作日数。

我的类定义如下:

<?php namespace MyApp\Libraries;

/**
* The Holiday Calculation Helper Library
*
* A helper class to calculate holidays and working days.
*/
class Holidays {

/**
* The defined EBS holidays: New Years Day
*/
const NEW_YEARS_DAY = "new years day";
/**
* The defined EBS holidays: Independence Day
*/
const INDEPENDENCE_DAY = "independence day";
/**
* The defined EBS holidays: Christmas Day
*/
const CHRISTMAS_DAY = "christmas day";

...

这些由(例如)date 方法使用,该方法采用假日常量值和年份并返回该年该假日的日期。我有一个门面和一个服务提供者设置,所以这个库可以在 The Laravel Way™ 中使用。一切都很完美,我对一切都有单元测试,我对代码很满意。

我的问题是如何引用这些常量。如果我使用外观并从代码的其他部分调用库,它看起来像这样:

$xmas = \Holidays::date(\MyApp\Libraries\Holidays::CHRISTMAS_DAY, "2014");

它有效,但我更愿意使用外观来实现它,如下所示:

$xmas = \Holidays::date(\Holidays::CHRISTMAS_DAY, "2014");

我想到的一个解决方案是在外观中定义常量。这行得通,但随后我将常量值从库中分离出来 - 出于显而易见的原因,我更愿意将这些值与它们关联的代码保持在一起。

然后,我想到了另一个解决方案:如上定义常量,然后像这样在外观中引用它们:

<?php namespace MyApp\Facades;

use Illuminate\Support\Facades\Facade;

class Holidays extends Facade {

/**
* The defined EBS holidays: New Years Day
*/
const NEW_YEARS_DAY = \MyApp\Libraries\Holidays::NEW_YEARS_DAY;
/**
* The defined EBS holidays: Independence Day
*/
const INDEPENDENCE_DAY = \MyApp\Libraries\Holidays::INDEPENDENCE_DAY;
/**
* The defined EBS holidays: Christmas Day
*/
const CHRISTMAS_DAY = \MyApp\Libraries\Holidays::CHRISTMAS_DAY;

...

现在我可以通过外观而不是完全限定的库类来引用常量,而且我只需要为常量定义一次值(尽管我确实需要向库和类中添加任何新常量正面)。这行得通,它让我得到了我想要的东西,但感觉有点违反了 DRY(不要重复自己)原则。

那么问题来了。这是最好的方法吗?

最佳答案

您可以使用 use 为您的 \MyApp\Libraries\Holidays 类添加别名,但不幸的是,使用 Holidays 会抛出一个 fatal error ,所以我建议将其别名为 Holiday,这也可能会在您将来避免一些混淆。

在声明类声明之前和声明命名空间之后添加...

use \MyApp\Libraries\Holidays as Holiday;

像这样在你的类里面使用....

$xmas = \Holidays::date(Holiday::CHRISTMAS_DAY, "2014");

关于php - 在外观中定义类常量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23345347/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com