为什么不能在PHP中返回self?

时间:2012-02-28 12:40:30

标签: php oop static

在PHP中,return self链接静态方法是不可能的。这限制了静态方法的使用,因为链接非常有用,您必须使用实例来链接方法。

有没有理由让PHP开发人员决定不允许返回self?或者是否一般不能在OOP中返回self

4 个答案:

答案 0 :(得分:3)

我不能给你一个理由为什么不支持语法本身。它几乎可以在PHP 5.3中运行:

class Foo
{
  public static function A()
  {
    return __CLASS__;
  }

  public static function B() { }
}

$chain = Foo::A();
$chain::B();

如果PHP会解析Foo::A()::B(),那么它会起作用。

答案 1 :(得分:2)

如果与你没有任何关系的人要求你放弃自己,让自己回到不存在的东西,你会感觉如何?

答案 2 :(得分:2)

你不能返回'self',因为我所知道的OOP语言不允许将类型作为类型返回(不知道如何改写)。但是,每个人都允许返回类型的实例。静态方法是类定义的一部分,只要应用程序运行,它就是可调用的。

在进行OOP时,你应该非常谨慎地使用static关键字,因为它很容易被滥用。如果要链接方法,则使用对象。当不需要任何状态时,静态方法应该仅使用 ,并且该函数只是处理输入并返回结果。

当链接时你必须维护状态,那就是你根本不使用静态类/方法(确实有一些情况但是那些是例外情况而不是这里的情况)。

答案 3 :(得分:2)

尝试return new static()return new self()

class Calculator
{
    private static $_var = 0;

    public static function startFrom($var)
    {
        self::$_var = $var;
        return new static();
    }

    public static function add($var)
    {
        self::$_var += $var;
        return new static();
    }

    public static function sub($var)
    {
        self::$_var -= $var;
        return new static();
    }

    public static function get()
    {
        return self::$_var;
    }
}

这可以用于链式静态方法:

echo Calculator::startFrom(10)
    ->add(5)
    ->sub(10)
    ->get(); // return 5
  

New self vs. new static