Это хорошая идея для внутреннего вызова конструктора в статическом методе? - PullRequest
2 голосов
/ 13 января 2010

Скажем, например, у меня был локализованный класс дат, где обычным способом было создание объекта.

$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();
    }
};

Я не разработал много классов, мне интересно, распространен ли это в ОО-языках.

1 Ответ

2 голосов
/ 13 января 2010

Проблема в MyAdvancedDate, который расширяет Date, вы всегда будете получать экземпляр родительского элемента, потому что self и __CLASS__ всегда будут ссылаться на класс, в котором находится метод. Это конечно, если Вы явно переопределяете метод в классах потомков. Это называется поздним статическим связыванием.

Когда мне нужно реализовать LSB в 5.2, я обычно создаю статическое свойство и соответствующие статические средства доступа, которые позволяют мне изменять класс, созданный статическими вызовами. Единственная вещь здесь - это все еще предполагает, что вы когда-либо будете использовать только одного потомка, так как изменение статического свойства изменит его по всем направлениям. Это может работать в ударе, хотя в зависимости от того, что фактическая архитектура проекта / приложения / модуля / пакета.

...