【问题标题】:Bad sign if I need a method of a class without calling a constructor because constructor needs parameters?如果我需要一个类的方法而不调用构造函数,因为构造函数需要参数,这是一个坏信号?
【发布时间】:2017-08-16 16:39:12
【问题描述】:
class Test
{
    private $flag;

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

    public function a()
    {
        if ($this->flag)
        {
            $this->b();
        }
    }

    public function b()
    {
        $this->c();
    }

    public function c()
    {
    }
}

外部方法想如何使用b(),但如果不创建Test,他就无法做到。但是 Test 需要一个参数,即使它不会被使用。 b() 也不能是静态的。

【问题讨论】:

  • 为什么b 是实例方法,那么如果您在概念上不需要实例来使用它呢?除非我遗漏了什么,否则这应该是静态的,甚至是外部助手。
  • ...嗯?介意澄清这个问题吗?
  • 您可以尝试默认构造函数值:public function __construct($flag = null)。否则,您需要确定 b() 是否真的需要成为该类的一部分。
  • 为什么不能是静态的?
  • @JohnSmith 本来很高兴看到完整的图片。如果 b 需要使用 c,而 c 需要一个实例,那么 b 也需要是一个实例方法,至少不需要重构。虽然没有看到真实的代码,我们只能猜测。

标签: php constructor static-methods


【解决方案1】:

回答原始问题:
是的,在不实例化类的方法(实例化需要参数)的情况下访问类方法的最佳方法是使所需的方法静态化。即使尚未构造对象,也要确保使用该方法是有意义的。请注意,您不能引用非静态内容,例如非静态方法,在静态上下文中,例如静态方法。

编辑(问题现在指定 b() 不能是静态的):
如果 b() 不能是静态的,那么它必须引用非静态成员,例如非静态函数或变量。换句话说,它必须引用一个需要实例化对象的实例变量。如果不实例化类,就不可能调用类的非静态方法。我建议您分析类结构并确定为什么 b() 必须是非静态的(跟踪它引用的任何函数或变量)。

查看 b() 的主体,它调用了非静态方法 c()。分析 c() 的主体并找出为什么 c() 必须是非静态的。如果找不到对对象实例的任何引用,则可以安全地将 c() 设为静态,从而将 b() 设为静态。另一方面,如果 c() 需要一个实例,那么 b() 也将需要一个实例,这意味着不可能将 b() 设为静态。

【讨论】:

  • 对不起,它不可能是静态的...我更新我的问题太晚了:)
  • static 方法只是一个名称奇特的全局函数。
【解决方案2】:

如果你需要创建类而不指定标志,那么你可以默认值:

public function __construct($flag = null)
{
    $this->flag = $flag;
}

您可以使用其他简单值来代替 null。如果您需要将其默认为简单值以外的其他值(即您需要调用另一个函数),那么您可以检查$flag 是否为空或不为空。然后您可以根据需要使用其他功能。

【讨论】:

    猜你喜欢
    • 2013-09-18
    • 1970-01-01
    • 1970-01-01
    • 2016-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-25
    • 2018-02-27
    相关资源
    最近更新 更多