【问题标题】:Use of private static methods使用私有静态方法
【发布时间】:2016-09-06 08:41:32
【问题描述】:

我正在尝试确定下面示例中的私有静态方法是否应该是非静态的。它只关心类的静态属性,这让我相信它可以作为静态方法。但是,它只能从非静态方法调用,这表明它也应该是非静态方法。

我知道什么时候公共方法应该是静态的,但不知道什么时候私有方法应该是静态的。

提前感谢您的建议!

<?php
class MyClass
{
    private static $initialized = false;
    private static $staticProperty1;
    private static $staticProperty2;
    private        $normalProperty1;

    public function __construct($normalProperty)
    {
        $this->normalProperty1 = $normalProperty;
    }

    public function doSomething()
    {
        self::initialize();
        // Now do some other stuff
    }

    private static function initialize()
    {
        if (!self::$initialized) {
            self::$staticProperty1 = 'Hello';
            self::$staticProperty2 = 'World';
            self::$initialized = true;
        }
    }
}

【问题讨论】:

    标签: php static static-methods private-members


    【解决方案1】:

    这是一个有趣的问题。您想知道私有函数何时应该是静态的。 如果你想从另一个静态方法调用它,它必须是静态的。那是因为您无权访问$this

    我之前的假设是不正确的。您还可以从静态函数调用非静态方法。但是您必须考虑到您无法使用变量$this 访问对象本身。也无法访问非静态对象属性。

    在您的示例中,我认为如果您无论如何从非静态上下文中调用该方法,则可以使其不是静态的。它不需要是静态的。但我不能告诉你这是否是好的做法。正是我会做的。

    【讨论】:

    • 好的,谢谢。我知道这最终可能归结为个人喜好,但我喜欢我的代码尽可能符合语义。
    【解决方案2】:

    当我希望我的公共静态方法调用另一个方法时,通常我会使用私有静态方法。

    【讨论】:

    • 是的,我也会这样做,但在这种情况下,公共方法不是静态的。您是否会将私有方法更改为非静态的,即使它只是设置静态属性?
    • 是的,我会将其更改为实例方法,因为它是由另一个实例方法调用的。也没有理由让它是静态的。另一件事是,既然你的方法现在初始化静态变量,它会工作,但如果你想初始化非静态变量,你想把它分开吗?
    • 好吧,有道理。您关于将来可能设置非静态属性的观点是一种很好的思考方式!
    猜你喜欢
    • 2012-07-14
    • 2010-11-04
    • 1970-01-01
    • 1970-01-01
    • 2016-06-28
    • 2019-03-27
    • 1970-01-01
    • 2019-07-26
    • 1970-01-01
    相关资源
    最近更新 更多