PHP5静态方法继承.超载.获得被叫类名

Dan*_*Dan 1 php oop static

我有很好的oop理解,但对它在php中的实现理解不足...

我有以下代码,希望它是自我记录=).

我需要BB输出

class A{
    // I can't copy function::classname() to all my descendant classes

    static function classname(){
        echo __CLASS__;
    }
}

class B extends A{

    static function test(){
        self::classname();
    }

    function test1(){
        self::classname();
    }



    //i have A LOT of static and non-static functions using self::classname() in their code
    // I can't copy all them to base class
    }

    $v = new B();
    B::test();
    $v->test1();
Run Code Online (Sandbox Code Playgroud)

我坚持static::self::语法


PS:我遇到的另一个疯狂的问题:

假设我有

function doSomething(){
    echo $this->id;
}
Run Code Online (Sandbox Code Playgroud)

有时它会进入静态上下文.是的,我知道,那是因为我糟糕的应用程序设计.但是可以创建第二个(镜像,重载)功能

static function doSomething(){
    echo false;
}
Run Code Online (Sandbox Code Playgroud)

这意味着使用 $obj->doSomething()return id并使用Class::doSomething()returnfalse


问题3:

静态上下文中的属性默认值是否可以自动获取非静态上下文中的属性值?

xzy*_*fer 5

看看后期的静态绑定.

class A {
    static function classname() {
        echo __CLASS__;
    }

    static function test1() {
        static::classname();
    }
}

class B extends A {
    static function classname() { 
        echo __CLASS__;
    }
}

$v = new B();
B::test1();
$v->test1();
Run Code Online (Sandbox Code Playgroud)

或者正如Long Ears在评论中指出的那样,假设你可以使用php 5.3.0+get_called_class()

class A {
    static function classname() {
        echo get_called_class();
    }

    // this can be defined in either class A or B without affecting the output
    static function test1() {
        static::classname();
    }
}

class B extends A {
}

$v = new B();
B::test1();
$v->test1();
Run Code Online (Sandbox Code Playgroud)

输出:

BB
Run Code Online (Sandbox Code Playgroud)