实例化类与静态类?

时间:2014-02-04 14:58:00

标签: php

我很难知道我是否应该使用静态或实例化的类。

我不确定我理解你为什么要使用它们,应该使用静态类来处理数据,而实例化的类有自己的数据。

我不确定这个苹果对我的工作有多大,例如,我有一个从数据库(产品列表)中获取数据的模型。

如果我的上述假设是正确的,那么我应该实例化模型,因为类有它自己的数据。

例如,如果我有一个转换日期的辅助类,那么它应该是静态的,因为它只是以不同的格式返回数据。

所有这些都是正确的,任何人都可以向我解释我在确定静态和实例化类之间时应该使用的更清晰或任何规则吗?

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

我在这里广泛地写了这篇文章:How Not To Kill Your Testability Using Statics。总结一下:

  • 静态类方法只不过是常规函数
  • 如果你没有实例化你的类,你可能也不会首先使用类,因为你没有使用对象而没有对象的OOP只是P,常规的旧程序编程
  • 对象可用于解耦和抽象应用程序的各个部分;这些部分包括“数据实体”以及数据库连接器和业务逻辑部件之类的东西,所有可以而且应该是一个对象
  • 静态属性和方法主要是 helper 并用于某些特殊情况,它们不是面向对象编程的主要焦点,不应该是总体设计理念< / LI>

链接文章中的选择引用:

  

强制性汽车类比:

     

类定向编程就像买车让它坐在里面   车道,反复打开和关闭门,跳来跳去   座椅,偶尔打开挡风玻璃刮水器,但从未   一旦转动点火钥匙并将其作为驱动器。它缺失了   完全是这一点。

答案 1 :(得分:1)

静态类并不是真的。您可能正在谈论,区别于该类的实例。类可以具有使用static关键字声明为静态的属性和方法。应用于属性的static关键字意味着您无法使用实例访问该属性。

class Foo {
    public static $prop = 123;
}

php > echo Foo::$prop
123
php > $f = new Foo(); $f->prop;
PHP Strict standards:  Accessing static property Foo::$prop as non static in php shell code on line 1

但是,您可以通过以下方式访问静态方法:

class Bar {
    public static function meth() { echo "Hello, World\n"; }
}
php > Bar::meth()
Hello, World
php > $b = new Bar();
php > $b->meth();
Hello, World

在精神上,静态方法是一件好事。承诺该方法的输出不依赖于对象的状态。但这并不是说它保证是无状态的,因为static关键字还有另一种用途:静态变量:

class Baz {
    public static function m() {
        static $callCount = 0;
        echo ++$callCount;
    }
}
php > Baz::m();
1
php > Baz::m();
2
php > $x = new Baz(); $y = new Baz();
php > $x->m();
3
php > $y->m();
4
…

因此静态是一种可以在类本身中存储状态的方法,与实例无关。您甚至可以将它们用于同一类的实例之间的消息传递。说实话,它的有效用途很少,并且很难直接用行为测试来覆盖有状态静态。

静力学的另一个用途是携带特定于类的信息。假设您希望一大堆类具有log方法,该方法始终在日志消息中包含一些特定于类的信息。

trait Xyzzy {
    public static function log($msg) {
        printf('[%s] %s', static::$_identifier, $msg);
    }
}
class Fuzzy {
    use Xyzzy;
    private static $_identifier = __CLASS__;
}
php > $f = new Fuzzy();
php > $f->log('hello, world');
[Fuzzy] hello, world

因此,如果您觉得静态是正确的方法,因为方法是

  1. 上下文适用于班级和无国籍,或
  2. 为班级带来状态。
  3. 然后你应该使用静态。它可以使测试变得更加困难,但测试是为了支持你,而不是妨碍你。

    顺便说一句,最近版本的PHPUnit can test a subset of static methods使用了后期静态绑定。