PHP 自动加载和函数中的静态变量

标签 php function static autoload extends

=== Base.php ===

<?php
class Base
{
    public static function e()
    {
        static $number = 0;
        $number++;
        var_dump($number);
    }
}

=== A.php ===

<?php
class A extends Base {}

=== B.php ===

<?php
class B extends Base {}

=== 测试.php ===

function __autoload($classname)
{
    require_once("{$classname}.php");
}

Base::e();
A::e();
B::e();

php test.php,结果为:

int(1)
int(2)
int(2)

为什么结果不是 1,1,1?

最佳答案

尝试

require "Base.php";
Base::e();
require "A.php";
A::e();

对比

require "Base.php";
require "A.php";
Base::e();
A::e();

前者会产生 int(1) int(2),而后者会产生 int(1) int(1)

为什么?

当一个类被绑定(bind)时,static 变量的内容会在那个时刻准确地被复制。静态变量的原始值没有备份。

这意味着,当类 A 被绑定(bind)时,当静态变量为 0 时,A::e() 将具有 0 作为静态值;如果它是 1A::e() 也会将 1 作为值。

B::e() 类似,因为 Base::e()A::e() 是独立的因为值被复制(没有引用)。它还将具有 Base::e()B 的绑定(bind)时具有的相同静态变量。

关于PHP 自动加载和函数中的静态变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32474618/

相关文章:

php - Zend Framework 2、Doctrine 2 以及业务逻辑适合的位置

php - 如何编写 sql 查询以显示带有结束日期列的特定时间段的任务提醒?

swift - 创建具有多个计算函数的简单类( )

c++ - 在类中使用静态成员对象有什么问题?

java - 我可以定义多个静态 block 吗?

c++ - 如何在 header 和 cpp 之间拆分静态/模板类?

php - PHP中多对多数据库的SQL查询

mysql - 当查询给出 1 时返回真

c - 函数指针声明 - __P 的作用是什么?

function - PowerShell 脚本不会产生错误,但无法正常工作