【问题标题】:Is it a good idea to internally invoke the constructor in a static method?在静态方法中内部调用构造函数是个好主意吗?
【发布时间】:2011-01-04 18:56:54
【问题描述】:

例如,假设我有一个本地化的日期类,其正常用途是创建一个对象。

$d = new Date(mktime(), 'MM-DD-YYYY', array('locale' => 'es'));

现在,如果我不想总是显式地创建一个新对象,而是想要更多类似...的东西,该怎么办?

<p>The date is <?php echo 
Date::formatDate( mktime(), 'MM-DD-YYYY', array('locale'=>'es') );?>
</p>

在我的formatDate 方法中,调用构造函数在内部创建日期对象是个好主意,还是应该完全使所有内部方法调用静态?

class Date {
    function getLocalisedDate( $time, $format, $options ) {
        $obj = Date::Date(
            $time, $format, $options
        ); // invoke the constructor
        return $obj->get();
    }
};

我没有开发很多类,我想知道这是否是 OO 语言中的常见模式。

【问题讨论】:

  • 一个更好的问题是:尽管 PHP4 正式死了,但仍然使用它是个好主意吗?)
  • 我只好支持了。
  • @meder:我很好奇为什么。它已停产。 5.3 虽然没有广泛部署,但已经发布,6 开发正在全面展开。谁还在为 php4 支持而死?
  • 你没有说任何我不知道的事情,事实上对于我们的客户来说,仍然有十几台服务器和几十个使用 PHP 4 的站点,而我没有权限或说服他们立即更新到 5 的授权,尽管今年至少有一段时间在进行中。
  • 啊企业巨兽效应:-)

标签: php oop php4 static-members


【解决方案1】:

问题在于Date 的MyAdvancedDate,那么您总是会获得父级的实例,因为self__CLASS__ 总是会引用该方法实际所在的类。这当然是除非您在后代类中显式覆盖该方法。这称为后期静态绑定。

当我需要在 5.2 中实现 LSB 时,我通常会创建一个静态属性和相应的静态访问器,以允许我更改由静态调用实例化的类。这里唯一的事情是这仍然假设您只会使用单个后代,因为更改静态属性将全面改变它。它可以根据项目/应用程序/模块/包的实际架构而发挥作用。

【讨论】:

  • 我知道它总是会创建一个实例,但它不会那么糟糕,不是吗?而且我也不会扩展这个类。
  • 不,只要您知道这很好。事实上,这是实现工厂方法和单例的常见做法。
猜你喜欢
  • 2021-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多