【发布时间】:2011-07-14 05:36:14
【问题描述】:
static functions 在 OOP 中有什么用?
它与其他功能有何区别?
【问题讨论】:
标签: php oop static-methods
static functions 在 OOP 中有什么用?
它与其他功能有何区别?
【问题讨论】:
标签: php oop static-methods
作为一个非常简单,有点做作的例子:
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'));
在这种情况下,静态函数用作替代构造函数,允许您从数据数组而不是单独的参数构造对象。
通常,静态函数提供围绕对象的功能,而无需实例化它。有很多用途。至少,从不实例化的完全静态的类可以用来将函数和相关数据捆绑在一起,这本身就使代码更干净。这就是它们与普通函数不同的地方:普通函数不能保存“外部”数据(不使用全局变量,您不想想要这样做),静态类方法可以将数据保存在静态类属性中。
【讨论】:
new Foo 和Foo::instantiateFromArray 创建实例,两者都接受不同类型的参数,但生成相同的实例。 Foo::__construct 是 canonical 构造函数,Foo::instantiateFromArray 是 alternative 构造函数。将构造函数设为私有只是为了强制调用者使用静态方法来实例化同一对象是没有意义的。
您无需实例化对象即可使用静态方法/属性。
因此,它们无法将状态存储在对象中。
它们通常用作命名空间相关方法的一种方式,例如
echo str::truncate($str, 100);
【讨论】:
静态函数用于在其实例不存在时调用类代码(在更纯粹的 oop 语言中)。静态函数可以更改静态变量。
【讨论】:
将类属性或方法声明为静态使它们无需实例化即可访问。声明为静态的属性不能被实例化的类对象访问(尽管静态方法可以)。
为了与 PHP 4 兼容,如果没有使用可见性声明,则属性或方法将被视为已声明为 public。
因为静态方法可以在没有创建对象实例的情况下调用,所以伪变量 $this 在声明为静态的方法中不可用。
不能使用箭头操作符通过对象访问静态属性 ->。
静态调用非静态方法会生成 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";
【讨论】: