Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如果我需要一个类的方法而不调用构造函数,因为构造函数需要参数,这是一个错误的标志?_Php_Constructor_Static Methods - Fatal编程技术网

Php 如果我需要一个类的方法而不调用构造函数,因为构造函数需要参数,这是一个错误的标志?

Php 如果我需要一个类的方法而不调用构造函数,因为构造函数需要参数,这是一个错误的标志?,php,constructor,static-methods,Php,Constructor,Static Methods,外部方法如何使用b(),但如果不创建Test,他就无法使用。但测试需要一个参数,即使它不会被使用b()也不能是静态的。回答原始问题: 是的,访问类的方法而不实例化它(实例化需要参数)的最佳方法是使所需的方法成为静态的。确保即使对象尚未构造,也可以使用该方法。请注意,您不能在静态上下文(例如静态方法)中引用非静态内容(例如非静态方法) 编辑(问题现在指定b()不能是静态的): 如果b()不能是静态的,那么它必须引用非静态成员,例如非静态函数或变量。换句话说,它必须引用需要实例化对象的实例变量。不实

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

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

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


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

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

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


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

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

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()
    {
    }
}

可以使用其他简单值而不是null。如果需要将其默认为简单值以外的值(即需要调用另一个函数),则可以检查
$flag
是否为null。然后可以根据需要使用其他函数。

如果需要创建类而不指定标志,则可以使用默认值:

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()
    {
    }
}

可以使用其他简单值而不是null。如果需要将其默认为简单值以外的值(即需要调用另一个函数),则可以检查
$flag
是否为null。然后您可以根据需要使用其他函数。

为什么
b
是一个实例方法,那么如果您在概念上不需要实例来使用它呢?除非我遗漏了什么,是的,这应该是静态的,甚至是一个外部助手…嗯?介意澄清一下这个问题吗?您可以尝试默认构造函数值:
public function\u construct($flag=null)
。否则,您需要确定
b()
是否真的需要成为该类的一部分。为什么它不能是静态的?@JohnSmith最初看到完整的图片会很好。如果b需要使用c,而c需要一个实例,那么b也需要是一个实例方法,至少不需要重构。但是,如果没有看到真正的代码,我们只能猜测。
b
为什么是一个实例方法,如果您在概念上不需要一个实例来使用它呢?除非我遗漏了什么,是的,这应该是静态的,甚至是一个外部助手…嗯?介意澄清一下这个问题吗?您可以尝试默认构造函数值:
public function\u construct($flag=null)
。否则,您需要确定
b()
是否真的需要成为该类的一部分。为什么它不能是静态的?@JohnSmith最初看到完整的图片会很好。如果b需要使用c,而c需要一个实例,那么b也需要是一个实例方法,至少不需要重构。没有看到真正的代码,我们只能猜测。对不起,它不能是静态的。。。我更新我的问题太晚了:)一个
static
方法只是一个具有奇特名称的全局函数。对不起,它不能是静态的。。。我更新我的问题太晚了:)一个
static
方法只是一个具有奇特名称的全局函数。