为什么相对静态调用没有实现扩展class的命名空间?
Why relative static call not implement namespace of extended class?
为什么只静态调用return2?
在我看来,class 不是绝对名称的调用应该取决于 class
中的当前名称空间
<?php
namespace A {
class B {
static function test(){
echo 1;
}
static function check(){
B::test();//1 why?
self::test();//1
static::test();//2
}
}
}
namespace B {
class B extends \A\B {
static function test(){
echo 2;
}
}
}
namespace {
B\B::check();
}
B::test()
在 A
命名空间内执行,因此采用由 A
命名空间提供的 B
class。因此 A\B::test
被调用。当前 class 的上下文与此无关。
以下示例表明,遗传与此行为无关。
<?php
namespace A {
class B {
static function test() {
echo 3;
}
}
class A {
static function test(){
echo 1;
}
static function check(){
B::test();//3
self::test();//1
static::test();//2
}
}
}
namespace B {
class B extends \A\A {
static function test(){
echo 2;
}
}
}
namespace {
B\B::check();
}
static::test
returns 2
即使您在 A
命名空间中,因为 static
从调用超级 class 获取上下文而不是当前命名空间。
self::test
returns1
,因为self
取当前class的上下文,而不是超class.
为什么只静态调用return2?
在我看来,class 不是绝对名称的调用应该取决于 class
中的当前名称空间<?php
namespace A {
class B {
static function test(){
echo 1;
}
static function check(){
B::test();//1 why?
self::test();//1
static::test();//2
}
}
}
namespace B {
class B extends \A\B {
static function test(){
echo 2;
}
}
}
namespace {
B\B::check();
}
B::test()
在 A
命名空间内执行,因此采用由 A
命名空间提供的 B
class。因此 A\B::test
被调用。当前 class 的上下文与此无关。
以下示例表明,遗传与此行为无关。
<?php
namespace A {
class B {
static function test() {
echo 3;
}
}
class A {
static function test(){
echo 1;
}
static function check(){
B::test();//3
self::test();//1
static::test();//2
}
}
}
namespace B {
class B extends \A\A {
static function test(){
echo 2;
}
}
}
namespace {
B\B::check();
}
static::test
returns 2
即使您在 A
命名空间中,因为 static
从调用超级 class 获取上下文而不是当前命名空间。
self::test
returns1
,因为self
取当前class的上下文,而不是超class.