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
方法只是一个具有奇特名称的全局函数。