Php 面向对象,将类变量直接添加到类中,而无需事先定义它们
我的问题很简单,我在课堂上看到了以下代码:Php 面向对象,将类变量直接添加到类中,而无需事先定义它们,php,oop,Php,Oop,我的问题很简单,我在课堂上看到了以下代码: class controller_activity { function __construct($args) { //the variable template is not defined or what happen?? $this->template = new Template('activity'); } ....... 通常我会在“public$template”或
class controller_activity {
function __construct($args) {
//the variable template is not defined or what happen??
$this->template = new Template('activity');
}
.......
通常我会在“public$template”或类似的类中看到变量的声明,但这种情况下,如果我像往常一样定义这些变量,那么我可以直接以这种方式添加变量吗?而不在之前定义它们,这是可推荐的吗
如果我像往常一样定义这些变量,这是一样的吗
不,缺少定义。会给他们看,但不会
我可以用这种方式直接添加变量吗
是的,这是可能的。它们将公开可见
之前没有定义它们吗
是的,之前没有定义它们。它们将公开可见
值得推荐吗
那要看情况。通常不会,但这条规则也有例外
如果我像往常一样定义这些变量,这是一样的吗
不,缺少定义。会给他们看,但不会
我可以用这种方式直接添加变量吗
是的,这是可能的。它们将公开可见
之前没有定义它们吗
是的,之前没有定义它们。它们将公开可见
值得推荐吗
那要看情况。通常不会,但这条规则也有例外。我认为这段代码之所以有效,是因为
$this->template
赋值发生在\u construct()
中,这在类实例化时几乎立即发生。因此,这可以被看作是一种草率的、但不可靠的变量赋值方法。但这对以后的可读性或调试没有帮助。所以答案是肯定的,你可以做到。这是“最佳实践”吗?100%不是。我认为这段代码之所以有效是因为$this->template
赋值发生在\u construct()
中,在类实例化时几乎立即发生。因此,这可以被看作是一种草率的、但不可靠的变量赋值方法。但这对以后的可读性或调试没有帮助。所以答案是肯定的,你可以做到。这是“最佳实践”吗?100%不是。虽然不推荐使用PHP,但使用变量的非约束性(弱类型)意味着可以动态声明类变量
我在很多场合都是偶然做的,但后来又回到过去,正确地定义了它们。默认情况下,它们将具有public
访问方法(与不在类的开头包含访问方法的行为相同,即$var=0
与private$var=0
)
同样,不建议这样做。我还没有具体测试过,但我可以想象他们会抛出一个
通知
错误。另一个问题是,这样做会使代码更难理解,无论是对你自己还是其他试图使用你的类的开发人员来说。虽然不推荐使用PHP,但它的非约束(弱类型)变量使用意味着可以动态声明类变量
我在很多场合都是偶然做的,但后来又回到过去,正确地定义了它们。默认情况下,它们将具有public
访问方法(与不在类的开头包含访问方法的行为相同,即$var=0
与private$var=0
)
同样,不建议这样做。我还没有具体测试过,但我可以想象他们会抛出一个
通知
错误。另一个问题是这样做会使代码更难理解,无论是对你自己还是其他试图使用你的类的开发人员来说。你发布的代码都可以正常工作
在PHP中,可以使用未声明的变量。在其他语言(如Java)中,不能使用未声明的变量。这只是风格的问题,但我个人不喜欢使用它们
请注意,如果模板变量没有像您的示例中那样声明,那么它是公共的您发布的代码可以正常工作 在PHP中,可以使用未声明的变量。在其他语言(如Java)中,不能使用未声明的变量。这只是风格的问题,但我个人不喜欢使用它们
请注意,如果模板变量没有像您的示例中那样声明,那么它具有public属性是来自运行系统的代码吗?您确定模板没有定义在这行代码下面的某个地方,并且在检查时错过了它吗?不,它们是许多代码的第一行,并且它们工作没有问题—来自运行系统的代码?你确定模板没有定义在这几行代码下面的某个地方,只是在检查时遗漏了它吗?不,它们是许多代码的第一行,并且它们可以正常工作;我想不出有多少情况是值得推荐的。对于您计划在类实例化后添加到类中的任何内容,似乎都应该使用关联数组
$properties
或类似的方法,并有明确的文档说明其作用。@ColinMorelli:众所周知的一个例外是PHP的弱stdClass
,它就是这样工作的。通常,当您实现一个具体类型时,您不希望这样,对。如果您的系统中有一些元数据处理,您还可以动态创建那些将公共属性分配给对象实例的元数据处理。当然,这往往是更脆弱的,但只要这是在处理过程中,它仍然是相当稳定的。不过,你是对的,我还是不推荐这样做。公平地说,stdClass
确实是这样工作的——但我想我们都知道,PHP核心做的很多事情都是完全错误的。我假设您的“此规则有例外”评论是指它们是值得推荐的情况,而不是在实践中这样做的情况;)推荐规则的例外是——至少在我看来——从不推荐我不能;我想不出有多少情况是值得推荐的。法罗群岛