静态还是非静态?

时间:2010-08-08 06:43:09

标签: php oop

在此上下文中使用什么更好,静态方法或简单的公共方法,并且总是这样调用它们:$ request = new Request(); if($ request-> isPostRequest()){do smth} 当然它更容易使用静态,但更适合使用什么?

Class Request {
 public static function isSecureConnection() {}
 public static function isPostRequest() {}
 public static function isAjaxRequest() {}
 ...etc

}

5 个答案:

答案 0 :(得分:6)

如果每个Request都是真正的实体,那么最好使用非静态成员。但是如果它不是并且通常使用方法,比如数学中的Sinus函数,那么它们最好是静态的。

总的来说,在一个只包含函数而没有数据成员的类中声明静态函数会更好。

答案 1 :(得分:1)

您应该始终创建一个类,如果要在非静态环境中使用它。

然后你可以将它用作具有延迟实例化的Singleton。或者甚至作为静态类实例化。或者甚至作为独立实例对象。您稍后决定如何处理它。

如果您首先将所有成员声明为静态,那么基本上只是在一个名为Class的美化命名空间中覆盖一堆全局变量。即使您没有调用它或在代码中使用它,您也将静态分配该类使用的内存。

所以,只要写成一个类,然后你决定如何处理它。静态/非静态。辛格尔顿/实例。工厂模式与否。内存分配器X / DLL绑定或诸如此类。

唯一的例外是用于代表对象实例进行簿记的静态成员;像引用计数,缓存和类似的东西。这是关于静态/非静态的好事,你可以混合搭配一些聪明的行为。

如果您以后想要其他请求怎么办?或者如果因为您处于多线程环境中而可以创建多个会发生什么?一旦你用静力学走这条路,事情会变得非常奇怪。

答案 2 :(得分:1)

看起来您正在处理一个特定请求。

现在这暗示你应该把它变成一个单身,和/或使用静态函数。

原因:

只有一个请求,所有状态都由传递给进程的环境定义。类方法只是辅助函数,并且您希望能够在没有类实例的情况下使用它们。

另一方面,你很少会使用静态函数和代表其中一个的类,例如一个用户,一个多个问题。

答案 3 :(得分:0)

将类属性或方法声明为静态使它们可以访问,而无需实例化类。声明为static的属性无法使用实例化的类对象访问(尽管静态方法可以)。

实施例

<?php
class Foo {
    public static function aStaticMethod() {
        // ...
    }
}

Foo::aStaticMethod();
$classname = 'Foo';
$classname::aStaticMethod(); // As of PHP 5.3.0
?>

请参阅Static Keyword from php.net的参考资料。

答案 4 :(得分:0)

如果可以,请使用静态方法作为默认方法。静态方法比非静态方法运行得更快。