使用self ::而不是$ this

时间:2018-04-13 21:57:26

标签: php static static-methods

我来自一些PHP代码,我认为编写它的开发人员有点矛盾。 所以这是他写的代码:

# Original data
data_count <- read.table(textConnection("
    A    B    C   D
    1    2    3   4
    5    6    5   4
    3    2    1   2
    3    4    5   6
    5    4    3   2"
    ), header = TRUE)

# Keep track of counts
counts <- data.frame(
    values = 1:6,
    counts = 0
)

# Loop through data frame
for (i in 1:(nrow(data_count) - 1)) {
    # Get two rows
    data_dynamic <- data_count[i:(i + 1), ]

    # Calculate difference and get boolean check
    bool_check <- data_dynamic[1, ] == data_dynamic[2, ]

    # Get values that are the same in consecutive row
    counted_consecutive <- data_dynamic[1, bool_check]

    # Check if you got any true values
    if (sum(bool_check) == 0) {
        next
    } else {
        increment <- counts[counted_consecutive, "counts"] + 1
        counts[counted_consecutive, "counts"] <- increment
    }
}
counts
#>   values counts
#> 1      1      0
#> 2      2      0
#> 3      3      1
#> 4      4      2
#> 5      5      0
#> 6      6      0

其中SQLState和STATE_CLEAN的定义如下:

if ($this->SQL !== null && $this->SQLState === self::STATE_CLEAN)
        return $this->SQL;

所以你可以看到,对于某些类属性,他使用$ this,对于某些人,他使用self ::我无法理解为什么。 可以任何人帮助。感谢

2 个答案:

答案 0 :(得分:3)

下面:

private $SQLState = self::STATE_CLEAN;

该属性初始化为常量的值。

在某些时候,属性可能会改变,但常量是常量。所以检查这个条件:

$this->SQLState === self::STATE_CLEAN

有必要验证当前状态是否与初始状态相同。

为了澄清,因为我认为我错过了问题的要点,因此使用了self::STATE_CLEAN,因为STATE_CLEANclass constant。使用$this->STATE_CLEAN会让你

  

注意:未定义的属性:someClass :: $ STATE_CLEAN

答案 1 :(得分:1)

良好的做法是:

使用 self::用于类常量
(当引用类时 - 您可能没有此类的初始化对象实例)

$this->用于类变量
(当引用初始化对象实例时)