OOP中静态函数有什么用?

时间:2011-07-14 05:36:15

标签: php oop static-methods

OOP中static functions有什么用?

如何区别于其他功能?

4 个答案:

答案 0 :(得分:6)

作为一个非常简单,有点人为的例子:

class Foo {

    protected $bar = null;
    protected $baz = null;

    public function __construct($bar, $baz) {
        $this->bar = $bar;
        $this->baz = $baz;
    }

    public static function instantiateFromArray(array $data) {
        return new self($data['bar'], $data['baz']);
    }

}

$foo = new Foo('bar', 'baz');
// or
$foo = Foo::instantiateFromArray(array('bar' => 42, 'baz' => 'nine'));

在这种情况下,静态函数用作替代构造函数,允许您从数据数组而不是单独的参数构造对象。

通常,静态函数提供对象周围的功能而无需实例化它。有很多用途。至少,从未实例化的完全静态类可用于将函数和相关数据捆绑在一起,这本身使代码更清晰。这就是它们与普通函数的不同之处:普通函数不能保存“外部”数据(不使用想要做的全局变量),静态类方法可以将数据保存在静态类属性中。 / p>

答案 1 :(得分:3)

您无需实例化对象即可使用静态方法/属性。

因此,他们无法将状态存储在对象中。

它们通常用作命名空间相关方法的一种方法,例如

echo str::truncate($str, 100);

答案 2 :(得分:1)

静态函数用于在没有任何实例存在时调用类代码(在更纯粹的oop语言中)。静态函数可以更改静态变量。

答案 3 :(得分:0)

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

为了与PHP 4兼容,如果没有使用可见性声明,那么属性或方法将被视为声明为public。

因为静态方法在没有创建对象实例的情况下是可调用的,所以伪变量$ this在声明为static的方法中不可用。

使用箭头操作符 - >。

无法通过对象访问静态属性

静态调用非静态方法会生成E_STRICT级警告。

与任何其他PHP静态变量一样,静态属性只能使用文字或常量初始化;表达式是不允许的。因此,虽然您可以将静态属性初始化为整数或数组(例如),但您可能不会将其初始化为另一个变量,函数返回值或对象。

class Foo
{
    public static $my_static = 'foo';

    public function staticValue() {
        return self::$my_static;
    }
}

class Bar extends Foo
{
    public function fooStatic() {
        return parent::$my_static;
    }
}


print Foo::$my_static . "\n";

$foo = new Foo();
print $foo->staticValue() . "\n";
print $foo->my_static . "\n";      // Undefined "Property" my_static 

print $foo::$my_static . "\n";
$classname = 'Foo';
print $classname::$my_static . "\n"; // As of PHP 5.3.0

print Bar::$my_static . "\n";
$bar = new Bar();
print $bar->fooStatic() . "\n";