PHP:self ::和class_name ::之间有什么不同?

时间:2014-04-23 08:47:05

标签: php

我有一个这样的课:
我想知道以下命令之间有什么区别,哪一个更好?

Class foo
{
    function test()
    {
        return false;
    }
    function test2()
    {
        return self::test();
    }
    function test3()
    {
        return foo::test();
    }
    static function test4()
    {
        return false;
    }
    function test5()
    {
        return self::test4();
    }
    function test6()
    {
        return static::test4();
    }

}

1 - self::test();foo::test();之间有什么不同? 2 - self::test4();static::test4();之间有什么不同? 请解释一下??

3 个答案:

答案 0 :(得分:2)

  

1 - 在self :: test()之间有什么不同;和foo :: test(); ?

它是相同的,如果在课程范围内使用,self::会更好,更改课程名称时不必更改代码。

  

2 - 在self :: test4()之间有什么不同;和static :: test4(); ?

static::test4()从php 5.3实现为 Late Static Bindings 羽毛,可用于在静态继承的上下文中引用被调用的类。

答案 1 :(得分:1)

简单地说: self - 引用您所在的类。而 class_name 可以在类本身之外调用类方法。

即 - 当你想在&f; foo'之外调用test6时 - 您无法通过“自我”调用它,您必须通过“foo ::'”来调用它。

哪一个更好?

正如我解释的那样。当自己在课堂上写作时,请使用“自我”。 - 这只是最佳实践'。

答案 2 :(得分:0)

self :: test()之间的区别是什么?和foo :: test(); ?

function test2()
{
    return self::test();
}

function test3()
{
    return foo::test();
}

它们都以相同的方式工作,但是当你想要重命名你的课程时; self仍会指向正确的类,但必须重命名foo

更好的方法是使用$this->test()

self :: test4()之间的区别是什么?和static :: test4(); ?

function test5()
{
    return self::test4();
}
function test6()
{
    return static::test4();
}

后者应用“后期静态绑定”,因此在扩展此类时会有所不同,例如:

class bar extends foo
{
    function test4() { return true; }
}

$b = new bar;

然后,当$b->test6()被调用时,它将返回true