【问题标题】:OOP, add class variables directly to a class, without define them beforeOOP,直接将类变量添加到一个类中,之前没有定义它们
【发布时间】:2013-01-24 14:52:55
【问题描述】:

我的问题很简单,我在课堂上看到了这段代码:

class controller_activity {
    function __construct($args) {
        //the variable template is not defined or what happen??
        $this->template = new Template('activity');     
    }
    .......

通常我在“public $template”之类的类中看到变量的声明或类似的,但是这种情况下,如果我像往常一样定义这些变量是一样的吗?我可以直接这样添加变量吗?,没有之前定义它们?,是否值得推荐?

【问题讨论】:

  • 代码是否来自正在运行的系统?您确定模板没有在这行代码下面的某个地方定义,而您只是在检查时错过了它吗?
  • nono,它们是许多代码的第一行,并且它们可以正常工作

标签: php oop


【解决方案1】:

如果我像往常一样定义这些变量是一样的吗?,

不,缺少定义。 get_object_vars 会显示它们,但 get_class_vars 不会。

这种方式可以直接添加变量吗,

是的,这是可能的。它们将是公开可见的。

之前没有定义它们?,

是的,之前没有定义它们。它们将是公开可见的。

值得推荐吗?

这取决于。通常不会,但这条规则也有例外。

【讨论】:

  • 我想不出很多值得推荐的情况。对于您计划在实例化后添加到类中的任何内容,似乎应该使用关联数组 $properties 或类似的,并有明确的文档说明它的作用。
  • @ColinMorelli:一个众所周知的例外是 PHP 的弱 stdClass 就是这样工作的。通常,当您实现具体类型时,您不希望这样,真的。如果您的系统中有一些元数据处理,您还可以创建那些动态分配公共属性给对象实例的元数据。当然这往往更脆弱,但只要这是在处理中,它仍然相当稳定。不过,你说得对,我还是不推荐这个。
  • 公平,stdClass 确实是这样工作的——但我认为我们都知道 PHP 核心所做的很多事情都是完全错误的。我认为您的“这条规则有例外”评论是指它们是值得推荐的情况,而不是在实践中完成的情况;)
  • 推荐规则的例外是 - 至少在我看来 - 从不推荐。 ;)
【解决方案2】:

我认为这段代码有效的原因是$this->template 分配发生在__construct() 中,这几乎立即发生在类实例化时。所以这可以被看作是一种草率的——但可以伪造的——进行变量赋值的方式。但这对以后的可读性或调试没有帮助。所以答案是肯定的,你可以这样做。这是“最佳实践”吗? 100% 没有。

【讨论】:

    【解决方案3】:

    虽然不推荐,但 PHP 及其对变量的非约束(弱类型)使用意味着可以动态声明类变量。

    我曾多次无意中这样做过,但后来又返回并正确定义了它们。默认情况下,它们将具有 public 访问方法(与在类的头部不包含访问方法的行为相同,即 $var = 0private $var = 0)。

    同样,不建议这样做。我没有专门测试过,但我想他们会抛出一个Notice 错误。另一个问题是,这样做会使代码更难遵循,无论是以后自己还是尝试使用您的课程的其他开发人员。

    【讨论】:

      【解决方案4】:

      您发布的代码将毫无问题地运行。

      在 PHP 中,您可以使用未声明的变量。在其他语言(如 Java)中,您不能使用未声明的变量。这只是风格问题,但我个人不喜欢使用它们。

      请注意,如果在您的示例中未声明模板 var,则具有 public visibility

      【讨论】:

        猜你喜欢
        • 2013-07-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-21
        • 2015-05-23
        • 2013-01-01
        • 2014-10-14
        • 1970-01-01
        相关资源
        最近更新 更多