Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/254.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_Oop - Fatal编程技术网

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核心做的很多事情都是完全错误的。我假设您的“此规则有例外”评论是指它们是值得推荐的情况,而不是在实践中这样做的情况;)推荐规则的例外是——至少在我看来——从不推荐我不能;我想不出有多少情况是值得推荐的。法罗群岛