在看Yii2代码的时候,有这么一段1
2
3
4
5
6
7
8
9
10
11if (isset(static::$classMap[$className])) {
$classFile = static::$classMap[$className];
if ($classFile[0] === '@') {
$classFile = static::getAlias($classFile);
}
} elseif (strpos($className, '\\') !== false) {
$classFile = static::getAlias('@' . str_replace('\\', '/', $className) . '.php', false);
if ($classFile === false || !is_file($classFile)) {
return;
}
}
当时有点困惑,为啥用了个static::$classMap[$className],而不是self::$classMap[$className],细看了下self和static的区别
大体可以理解为static定义的function 如果子类又重新实现了的话,会用子类的结果(实际运行的时候的),而self永远是最开始定义的父类的结果
与self类似的还有 CLASS 和get_class() 只会是最开始定义的结果,不过注意get_class($this)会是实际运行时的类的结果
1 |
|
1 |
|
The output should look roughly like this:
‘a’ - said the base_class
‘a’ - said the derived_class
‘b’ - said the derived_class
‘b’ - said the derived_class