Почему невозможно вернуть себя в PHP? - PullRequest
4 голосов
/ 28 февраля 2012

В PHP невозможно вернуть себя для цепочки статических методов. Это ограничивает использование статических методов, потому что цепочка довольно полезна, и вы должны использовать экземпляры для цепочки методов.

Есть ли причины, по которым разработчики PHP решили не разрешать возвращать self? Или вообще невозможно вернуть self в ООП?

Ответы [ 4 ]

3 голосов
/ 28 февраля 2012

Я не могу дать вам причину , почему , кроме самого синтаксиса, не поддерживается. Это почти могло работать в PHP 5.3:

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

  public static function B() { }
}

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

Если PHP будет анализировать Foo::A()::B(), то это будет работать.

2 голосов
/ 02 декабря 2017

Попробуйте 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

Новое Я против новогостатический

2 голосов
/ 28 февраля 2012

Вы не можете вернуть 'self', потому что ни один из известных мне языков ООП не позволяет возвращать тип как тип (не знаю, как это перефразировать).Однако каждый позволяет вернуть экземпляр типа.Статический метод является частью определения класса и может вызываться до тех пор, пока приложение выполняется.

При выполнении ООП вы должны очень осторожно использовать ключевое слово static, так как злоупотреблять им очень легко.Если вы хотите объединить методы, используйте объект.Статические методы должны использоваться только , когда состояние не требуется, и функция просто обрабатывает ввод и возвращает результат.

При объединении в цепочку вы должны поддерживать состояние, а именно там вы не используетестатические классы / методы вообще (хорошо, есть некоторые случаи, но это исключения, и здесь это не так).

2 голосов
/ 28 февраля 2012

Если бы кто-то, кто не имел к вам никакого отношения, попросил вас отказаться от себя и вернуть себя к чему-то несуществующему, как бы вы себя чувствовали?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...