为什么无法在PHP中返回self?

Why is it not possible to return self in PHP?


为什么无法在PHP中返回self? 已获得4个解决方法 2020-08-18 18:08:05 php

在PHP中,无法将self返回到链静态方法.这限制了静态方法的使用,因为链接非常有用,您必须使用实例来链接方法.

是否有任何原因导致PHP开发人员决定不允许返回 self ?还是一般情况下无法在OOP中返回 self


为什么无法在PHP中返回self? 方法1

我不能给你一个为什么除了语法本身不被支持的原因.它几乎可以在PHP 5.3中工作:

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

  public static function B() { }
}

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

如果PHP将解析 Foo::A()::B() ,那么它将工作.


为什么无法在PHP中返回self? 方法2

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

在做OOP时,你应该非常小心地使用静态关键字,因为它很容易滥用它.如果你想链方法,然后使用一个对象.在不需要状态且函数仅处理输入并返回结果时才使用静态方法.

当链接时,你必须保持状态,这就是你根本不使用静态类/方法 (好的,有一些情况,但这些是例外,这里不是这种情况).


为什么无法在PHP中返回self? 方法3

尝试 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

新自我与新静态


为什么无法在PHP中返回self? 方法4

如果一个和你没有关系的人要求你放弃自己,让自己回到不存在的事情上,你会有什么感觉?


.htaccess .net .net-core 2d 3d 3d-printing ab-initio abp abstract-syntax-tree actions-on-google actionscript-3 active-directory activemq activemq-artemis acumatica adobe-xd aframe ag-grid agora.io air airflow ajax akka alert alexa algorithm alignment allure amadeus amazon-cloudformation