我很难知道我是否应该使用静态或实例化的类。
我不确定我理解你为什么要使用它们,应该使用静态类来处理数据,而实例化的类有自己的数据。
我不确定这个苹果对我的工作有多大,例如,我有一个从数据库(产品列表)中获取数据的模型。
如果我的上述假设是正确的,那么我应该实例化模型,因为类有它自己的数据。
例如,如果我有一个转换日期的辅助类,那么它应该是静态的,因为它只是以不同的格式返回数据。
所有这些都是正确的,任何人都可以向我解释我在确定静态和实例化类之间时应该使用的更清晰或任何规则吗?
感谢您的帮助!
答案 0 :(得分:1)
我在这里广泛地写了这篇文章:How Not To Kill Your Testability Using Statics。总结一下:
链接文章中的选择引用:
强制性汽车类比:
类定向编程就像买车让它坐在里面 车道,反复打开和关闭门,跳来跳去 座椅,偶尔打开挡风玻璃刮水器,但从未 一旦转动点火钥匙并将其作为驱动器。它缺失了 完全是这一点。
答案 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
因此,如果您觉得静态是正确的方法,因为方法是
然后你应该使用静态。它可以使测试变得更加困难,但测试是为了支持你,而不是妨碍你。
顺便说一句,最近版本的PHPUnit can test a subset of static methods使用了后期静态绑定。