试图理解PHP中的后期静态绑定

use*_*256 10 php

<?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::$tableNameRecord已经指Record::$tableName,不能再更改.

使用时static,不会立即解析引用.它只有在你打电话时才会得到解决User::getTableName(),此时你处于上下文中User,所以static::$tableName解决了User::$tableName.

换句话说:self总是指的是它所写的类,没有两种方式.什么static是指要看什么情况下它的二手; 在实践中,这意味着它可以引用子类,如果它正在扩展的类.这使得它$this只能用于静态上下文.