<?php
class Record {
protected static $tableName = 'base';
public static function getTableName() {
echo self::$tableName;
}
}
class User extends Record {
protected static $tableName = 'users';
}
User::getTableName();
Run Code Online (Sandbox Code Playgroud)
它显示:基础
题:
我知道我可以通过改变这一行echo self::$tableName;来改变问题echo static::$tableName;,它被称为'后期静态绑定',我在这里阅读了doc ,但仍然不太了解它.所以你能给我一些解释:
一个.为什么这行代码echo self::$tableName;显示:base?
湾 为什么这行代码echo static::$tableName;显示:用户?
dec*_*eze 29
self静态地在编译时"绑定".这意味着在编译代码时,决定self引用什么.static在运行时解析,即代码执行时.这是后来的静态绑定.这就是区别.
有self,它是在编译时决定的(当代码被"读"时),self指的是Record.后来的代码User进行分析,但self::$tableName在Record已经指Record::$tableName,不能再更改.
使用时static,不会立即解析引用.它只有在你打电话时才会得到解决User::getTableName(),此时你处于上下文中User,所以static::$tableName解决了User::$tableName.
换句话说:self总是指的是它所写的类,没有两种方式.什么static是指要看什么情况下它的二手; 在实践中,这意味着它可以引用子类,如果它正在扩展的类.这使得它$this只能用于静态上下文.