【问题标题】:php static magic variable set functionphp静态魔术变量设置函数
【发布时间】:2011-01-19 20:03:21
【问题描述】:

我正在使用一些由我之前的人编写的代码,我正在尝试查看它并了解系统以及它是如何工作的。我对 PHP 也很陌生,所以我有几个问题想问那些愿意并有能力提供的人。

有问题的代码的基本分解是这样的:

$__CMS_CONN__ = new PDO(DB_DSN, DB_USER, DB_PASS);
Record::connection($__CMS_CONN__);

第一个问题,我知道双下划线让它很神奇,但我无法在任何地方准确找到延伸到它的属性,除此之外它的行为就像一个常数。那是什么意思呢?

class Record
{
    public static $__CONN__ = false;
    final public static function connection($connection)
    {
        self::$__CONN__ = $connection;
    }
}

其次,这两部分结合在一起。它们分别位于单独的文件中。根据我的阅读,静态变量可以像静态函数一样被引用,所以你不能直接调用变量并直接设置它而不是使用函数吗?

我觉得它比我意识到的更多,但我需要从某个地方开始。

【问题讨论】:

  • 标识符中的下划线在 PHP 中没有特殊意义。但它们通常意味着表明该属性应被视为内部属性。

标签: php static


【解决方案1】:

这不是一个神奇的变量。写这篇文章的人不应该对这样的变量名使用双下划线,因为这会引起混淆。

这只是一个类的静态属性。这意味着它在该类的实例之间共享(在同一个 php 请求中)。

如果您不确定它们的工作原理,请查看 static properties 的文档。

【讨论】:

  • 好的,所以没有将你自己的东西定义为魔法,它只适用于具有该命名约定的预定义 php 函数。我想现在我知道我可以离开它们,改变它们会很痛苦。
【解决方案2】:

有几个使用这种命名风格的预定义“magic constants”。但是,我不认为下划线有什么特别的意义(就语言而言);即像这样定义自己的变量不会赋予它任何神奇的属性。它可能是以前程序员命名约定的一部分,如果是这样,它可能是不明智的。

在许多情况下,通过函数设置属性可以使“客户端”代码对类实现的更改更具弹性。所有实现细节都可以隐藏在方法中(称为“setter”)。但是,对于这是否是一个好主意,人们有强烈的感觉(我不是一个忠实的粉丝)。

【讨论】:

    【解决方案3】:
    1. 两个下划线不会使变量变魔术。
    2. 使用 getter/setter 比直接访问类属性要好。

    【讨论】:

    • Getter/setter 不是最佳实践。 PHP 开发人员发现这个习惯用语的时间很晚,在abandoning it again. 中更晚了
    • 虽然我同意应该抽象实现,但当需要访问属性时,最好还是不要直接访问它们。
    • 我稍微改变了我的说法。
    【解决方案4】:

    PHP 手册在naming variables (and other symbols) with underscores 上有这样的说法:

    PHP 将所有以 __ 开头的符号保留为魔法符号。建议您不要在 PHP 中创建以 __ 开头的符号,除非您想使用记录在案的神奇功能。

    特别注意“保留”和“记录”这两个词的使用。他们的意思是双下划线不应该用于用户定义的符号,因为它可能会导致未来的冲突,并且除非在手册中明确提到该符号是魔法,否则它是平凡的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-01-04
      • 2012-11-23
      • 1970-01-01
      • 1970-01-01
      • 2010-11-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多