gpt4 book ai didi

php - 试图理解 php 中的后期静态绑定(bind)

转载 作者:可可西里 更新时间:2023-10-31 22:18:27 24 4
gpt4 key购买 nike

<?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; 更改为 echo static::$tableName; 来改变这个问题,它被称为“late static”绑定(bind)',我阅读了文档 here ,但还是不太明白。那么你能给我一些解释吗:

一个。为什么这行代码 echo self::$tableName; 显示:base?

为什么这行代码 echo static::$tableName; 显示:users?

最佳答案

self 在编译时静态地“绑定(bind)”。这意味着当代码被编译时,它决定了self指的是什么。 static运行时 解析,即在执行代码时。那是晚期静态绑定(bind)。这就是区别。

对于self,在编译时(当代码被“读取”时)决定,self 指的是Record。稍后解析了 User 的代码,但是 Record 中的 self::$tableName 已经引用了 Record::$tableName 并且不能再更改。

当您使用static 时,引用不会立即解析。它仅在您调用 User::getTableName() 时得到解决,此时您处于 User 的上下文中,因此 static::$tableName 解析为 User::$tableName

换句话说:self 总是引用它所在的类,没有两种方式。 static 指的是什么取决于它在什么上下文中使用;实际上,这意味着如果它所在的类正在扩展,它可能会引用子类。这使得它像 $this 一样工作,仅适用于静态上下文。

关于php - 试图理解 php 中的后期静态绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17782441/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com