我有点困惑,因为我对 PHP 中的 OOP 经验不多。我总是听说使用实例方法比使用静态方法更好,这是为什么呢?
我需要一个深入的答案和解释,谢谢。
例如,为什么下面的这个应该用实例方法来完成?
Controller :
public function getProperty($id){
$property = Property::getProperty($id);
return $property;
}
型号:
public static function getProperty($id){
//$query = DB::table('properties')...
//Some Code;
return $query;
}
我正在阅读有关 setter/getter、实例与静态等的内容。但我需要一个完整的答案来理解事物的方式和原因。
最佳答案
一般来说,正如您已经指出的那样,实例方法是更好的做法。这并不是说静态方法是彻头彻尾的邪恶,它们只是具有不同且独特的目的。
重要的要注意,在处理实例方法时,您正在处理一个对象,而在处理静态方法时,您正在处理一个类。使用静态方法时,您将无法访问通常可用于实例的任何非静态属性。
以如下代码为例:
class Foo
{
private $bar;
private static $tavern;
public function changeBar($value)
{
$this->bar = $value;
}
public function getBar()
{
return $this->bar;
}
public static function changeTavern($value)
{
self::$tavern = $value;
}
public static function getTavern()
{
return self::$tavern;
}
}
类 Foo
有一个静态属性 $tavern
和一个非静态属性 $bar
。
如果创建了 Foo
的实例,则所有属性和方法都可用于该对象。
如果 Foo
被静态引用,则只有 $tavern
属性、changeTavern()
方法和 getTavern()
方法可用于类。
让我们看下面的代码:
$foo = new Foo();
$foo->changeBar('Tipsy Turvy');
echo $foo->getBar(); // prints Tipsy Turvy
由于 $foo
是 Foo
的一个实例,它可以访问整个类。调用 changeBar()
将修改 $bar
属性。直接从静态方法更改 $bar
属性将触发错误,因为 $bar
可用于 object 而不是 类。
// Calling this method would trigger an error
public static function changeBar($value)
{
$this->bar = $value; // PHP will crash and burn if you try this.
}
如果你想从静态方法访问类属性,这些属性也必须声明为静态的。这将在上面的类的上下文中工作。您还会注意到 Foo
的实例读取静态属性没有问题。
Foo::changeTavern('Stumble Inn');
echo Foo::getTavern(); // prints Stumble Inn
echo $foo->getTavern(); // also prints Stumble Inn
关于静态代码要记住的另一件事是它的行为不像一个实例。当 Foo
的第一个实例被构建时,两个属性 $bar
和 $tavern
都没有值。如果您要创建 Foo
的另一个实例,您会发现这些属性中只有一个不再包含值。 (我相信现在您已经猜出是哪一个了。)
$anotherFoo = new Foo();
echo $anotherFoo->getBar(); // prints nothing
echo $anotherFoo->getTavern(); // prints Stumble Inn
echo Foo::getTavern(); // prints Stumble Inn
再说一次,静态代码意味着您正在直接使用一个类 - 实例意味着您正在使用一个对象。重要的是要注意,您编写的任何类型的类如果想要具有某种状态,都应该用作实例。
静态类可能有点难以调试和测试。测试可能会有问题,因为静态属性在您创建新实例时不会更改。调试也很困难,因为静态属性的值在一个类的所有实例中都是相同的。对其中一个进行更改,您将对所有这些进行更改。追踪哪个实例进行了更改是一件痛苦的事情。
打个比方,像糖一样使用静态类 - 谨慎使用,仅在必要时使用。
希望这有助于阐明该主题。
关于PHP - 静态方法与实例方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30402978/