OOP中static functions
有什么用?
如何区别于其他功能?
答案 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";