除了单身人士之外,在PHP中使用静态方法有哪些令人信服的理由?

时间:2011-01-13 22:57:53

标签: php design-patterns static implementation

我最近回答了这个问题:

What are good reasons to use static methods in PHP?

首先要想到的是一个单身人士。除了一点点例外,其他回答者提供了相同的单例示例。但这让我思考......除了创建单身之外,我并没有真正使用静态方法或属性!

简短的搜索结合了很多关于使用静态方法的教程,几乎所有这些教程都实现了相同单例类的一些变体。

我真的很感兴趣:除了创建单例之外,我们还有什么理由要制作静态方法(或者只是懒惰而想要一个全局函数)?

有没有人有一个使用静态方法的实用示例,使用动态设计模式无法更好地完成?示例可以是一个单例,如果它在它的上下文中是有意义的,但我对解决方案的单例方面以外的其他原因感兴趣。

3 个答案:

答案 0 :(得分:6)

工厂模式通常也会使用静态调用;但是对任何没有依赖于实例属性或其他实例方法的类mathod使用静态方法是明智的,特别是当它们被定期调用时,出于性能原因。

PHPExcel中以下方法的逻辑位置在PHPExcel_Cell类中,因为它直接涉及操作单元格地址(任何单元格地址,而不仅仅是特定实例的地址),但它不依赖于实例,所以我宣布它是静态的。

public static function stringFromColumnIndex($pColumnIndex = 0) {
    if ($pColumnIndex < 26) {
        return chr(65 + $pColumnIndex);
    } elseif ($pColumnIndex < 702) {
        return chr(64 + ($pColumnIndex / 26)).chr(65 + $pColumnIndex % 26);
    }
    return chr(64 + (($pColumnIndex - 26) / 676)).chr(65 + ((($pColumnIndex - 26) % 676) / 26)).chr(65 + $pColumnIndex % 26);
}

这种方法测试并不是特别困难

答案 1 :(得分:4)

不一定是模式。 PHP不是持久性环境,因此任何对象实例的生命周期可能都是毫秒,但它需要内存分配/释放和额外的cpu周期。除非您需要可重用的对象或集合,否则我发现非静态对象几乎没有理由。

答案 2 :(得分:2)