PHP - 静态方法与实例方法

标签 php oop

我有点困惑,因为我对 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

由于 $fooFoo 的一个实例,它可以访问整个类。调用 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/

相关文章:

php - 您的 openssl 扩展不支持 SHA384,无法验证 phar 文件的完整性

php - Laravel 拒绝用户 'root' @'localhost' 访问(使用密码 : YES) in laravel 5. 7

php - 在 PHP 中,是否可以判断某个方法是否由父级显式调用:

javascript - 在javascript中创建未知数量的对象

oop - Grails:当我不想保存任何东西时,我可以使用域对象吗?

javascript - 如何使用 jQuery 将行追加到表中?

java - Android JAVA从php获取数组

javascript - 完成某项操作后,逐一显示 ajax 进程

Python 实例变量显然共享数据

java - 如何链接这两个鼠标事件? JavaFX