【问题标题】:Why is it not possible to return self in PHP?为什么不能在 PHP 中返回 self?
【发布时间】:2012-03-17 22:22:35
【问题描述】:

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

PHP 开发人员决定不允许返回self 有什么原因吗?还是一般OOP中不能返回self

【问题讨论】:

  • 说实话,链接被过度使用到影响可读性的地步,因为每个人似乎都认为干净可读代码的目的是使最长的链成为可能(以类似的方式人们过去认为嵌套的三元组很酷);无论如何,请看这里stackoverflow.com/questions/125268/…
  • 我认为这是个人喜好问题。
  • 如果您需要链接静态方法,那么您可能犯了一些设计错误。
  • @Crozin 你能再解释一下吗?也许我对一些 OOP 概念的理解有误。
  • 完全同意。让您与对象进行顶级交互,但绝不会比这更深入(或至少避免它)。否则,当您稍后更改对象结构时,您最终会得到 Spaghetti 对象和维护混乱。

标签: php oop static


【解决方案1】:

如果一个与你没有任何关系的人要求你放弃自己,让自己回到不存在的东西上,你会怎么想?

【讨论】:

  • 幸运的是 PHP 没有任何感觉,因为它每天被告知几百万次 die()
【解决方案2】:

您不能返回“自我”,因为我所知道的任何 OOP 语言都不允许将类型作为类型返回(不知道如何改写)。然而,每个人都允许返回一个类型的 instance。静态方法是类定义的一部分,只要应用程序运行,它就可以调用。

在做 OOP 时,你应该非常小心地使用 static 关键字,因为它很容易被滥用。如果要链接方法,请使用对象。 在不需要状态且函数只处理输入并返回结果时才应使用静态方法。

在链接时,您必须维护状态,这就是您根本不使用静态类/方法的地方(好吧,有些情况是例外,这里不是这种情况)。

【讨论】:

  • 在 Python 或 Ruby 中,return cls/self 在类方法中工作得很好(因为实际上类本身就是这些语言和许多其他语言中的一等对象)。
  • 我不知道 python 也不知道 ruby​​ :)。但是我仍然很奇怪将静态类返回为本身,只是为了节省输入几个字符?!
  • MikeSW:我没有说这样做是明智的,但至少在基于对象的语言中应该是可能的(基于对象的一切都是对象,包括类型)。
【解决方案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(),那么它会起作用。

【讨论】:

    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 2013-04-18
      • 2012-12-12
      • 2019-04-23
      • 1970-01-01
      • 2015-03-20
      • 2020-11-23
      • 2022-08-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多