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

2022-08-31 01:20:01

=== 基地.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 测试.php,结果是:

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

为什么不是结果 1,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)

为什么?

绑定类时,变量内容将恰好在那一刻复制它的当前状态。没有静态变量的原始值的备份。static

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

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


答案 2

我对这个问题做了一些研究,这真的很奇怪。

方法中的静态属性在对象实例之间保持其状态。这可能会令人困惑。还有两个静态函数,一个是静态函数,另一个是方法内部的静态变量。

它可以与自动加载机连接。我用你做了类似的例子,但没有使用静态方法,而是在方法中使用静态变量。结果是1:1:1,使用自动加载机和同一文件。

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

    public static function e()
    {
        static $number = 0;
        $number++;
        var_dump($number);
    }
}


$base = new Base();
$base->t();

$a = new A();
$a->t();

$b = new B();
$b->t();

另外,如果您不执行,则结果是正确的。Base::e()

我已经在没有自动加载的情况下做了require_once,它仍然有效。因此,这肯定是因为自动加载机。

如果你把

require_once "Base.php";
require_once "A.php";
require_once "B.php";

而不是自动加载器功能,它的工作原理。为什么我不知道我试图找到任何考虑自动加载器静态变量的东西,但没有成功。但是,这个答案可能会给你一些线索。


推荐