Php 在OOP中静态函数的用途是什么?
在OOP中,Php 在OOP中静态函数的用途是什么?,php,oop,static-methods,Php,Oop,Static Methods,在OOP中,静态函数有什么用途 它与其他函数的区别是什么?您不需要实例化对象来使用静态方法/属性 因此,它们无法将其状态存储在对象中 它们通常被用作与命名空间相关的方法的一种方式,例如 echo str::truncate($str, 100); 作为一个非常简单的、有点做作的例子: class Foo { protected $bar = null; protected $baz = null; public function __construct($bar,
静态函数
有什么用途
它与其他函数的区别是什么?您不需要实例化对象来使用静态方法/属性 因此,它们无法将其状态存储在对象中 它们通常被用作与命名空间相关的方法的一种方式,例如
echo str::truncate($str, 100);
作为一个非常简单的、有点做作的例子:
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'));
在本例中,静态函数用作替代构造函数,允许您从数据数组而不是单独的参数构造对象
通常,静态函数提供对象周围的功能,而无需实例化对象。这有很多用途。至少,从不实例化的完全静态类可以用来将函数和相关数据捆绑在一起,这本身就让代码更干净。这就是它们与普通函数的不同之处:普通函数无法保存“外部”数据(如果不使用globals,这是您不想做的),静态类方法可以将数据保存在静态类属性中。将类属性或方法声明为静态,无需实例化类即可访问它们。声明为静态的属性不能通过实例化的类对象访问(尽管静态方法可以) 为了与PHP4兼容,如果未使用可见性声明,则该属性或方法将被视为公共属性或方法 由于静态方法可以在没有创建对象实例的情况下调用,因此伪变量$this在声明为静态的方法中不可用 无法使用箭头运算符->通过对象访问静态属性 静态调用非静态方法会生成E_严格级别警告 与任何其他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";
静态函数用于在不存在任何实例时(在更纯粹的oop语言中)调用类代码。静态函数可以更改静态变量 至少可以说,从构造函数复制并粘贴的内容应该是私有的?在某些情况下,我们编写静态函数来创建一个新实例,因为我们不允许直接创建该类的实例。在这段时间里,我们将把构造函数写成私有的。我认为,公共构造函数+静态函数不是创建OOP设计的写入方式(如果在创建实例时使用静态函数)。@Sahal如我所写,在这种情况下,静态方法是另一种对象构造函数。您可以通过
new Foo
和Foo::instanceFromarray
创建实例,这两种方法都接受不同类型的参数,但产生相同的实例Foo::_构造
是规范构造函数,Foo::InstanceFromarray
是替代构造函数。让构造函数私有化只是为了迫使调用方使用实例化同一对象的静态方法是没有意义的。