2

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

$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 语言中的常见模式。

4

1 回答 1

2

问题在于 < php 5.3 中的静态方法总是要创建硬编码类的实例。因此,如果您实际使用MyAdvancedDatewhich extendsDate您总是会获得父类的实例,因为self并且__CLASS__总是会引用该方法实际所在的类。这当然是除非您在后代类中显式覆盖该方法。这称为后期静态绑定。

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

于 2010-01-13T19:09:35.837 回答