<?PHP class Record { protected static $tableName = 'base'; public static function getTableName() { echo self::$tableName; } } class User extends Record { protected static $tableName = 'users'; } User::getTableName();
它显示:基地
题:
我知道我可以通过改变这行来改变问题echo self :: $tableName;回声static :: $tableName;它被称为’晚期静态绑定’,我读了doc here,但仍然不太明白.那么你可以给我一些解释:
自己在编译时是静态的.这意味着当代码被编译时,决定自己所指的是什么.静态在运行时解析,即执行代码时.这是静态绑定的时间.这是有区别的.
使用自己,在编译时决定(当代码为“read”)时,自己指的是Record.后来对User的代码进行了解析,但在记录中的self :: $tableName已经指向Record :: $tableName,不能再更改了.
当您使用静态时,引用未立即解决.只有当您调用User :: getTableName()时才解决此问题,此时您位于User的上下文中,因此static :: $tableName已解析为User :: $tableName.
换句话说:自我总是指已经写入的类,没有两种方式.什么静态指的是取决于它使用的内容;在实践中,这意味着它可以引用子类,如果它发生的类正在被扩展.这使得它像$this一样工作,仅适用于静态上下文.