=== 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
作为静态值;如果它是 1
,A::e()
也会将 1
作为值。
B::e()
类似,因为 Base::e()
和 A::e()
是独立的因为值被复制(没有引用)。它还将具有 Base::e()
在 B
的绑定(bind)时具有的相同静态变量。
关于PHP 自动加载和函数中的静态变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32474618/