PHP Проверяет, есть ли цепочка методов, или повторно возвращает результат

#php #chaining #method-chaining

Вопрос:

Если у Translation вас есть класс, в котором я хочу сделать это возможным:

$result = Translation::translate('input');

Это вернет результат со свойствами по умолчанию, заданными в классе или

$result = Transltion::translate('input')->from('DE')->to('ES');

…который должен возвращать результат с вновь заданными свойствами с помощью метода chainung.

Есть ли простой способ достичь этого?

Вот мой класс:

 <?php

namespace AppApi;


use AppApiHelperHasHtml;


class Translation
{

    use HttpRequest,
        HasHtml,
        ManageTranslations;


    public string $from = 'DE';

    public string $to = 'EN';

    public string $text = '';

    protected array $body;


    public function __construct( string $text )
    {
        

        $this->body = [
            'target_lang'         => $this->to,
            'source_lang'         => $this->from,
            'text'                => $this->text,
        ];

    }


    public static function translate( string $text ) : self
    {
        // either return new static with defaults
        // or check if from or to is called ??
        return new static($text);
    }


    public function from( string $language = 'DE' ) : self
    {

        $this->from = $language;

        return $this;
    }


    public function to( string $language = 'EN' ) : self
    {

        $this->to = $language;

        return $this;
    }
}
 

Это решение работает очень хорошо Translation::translate()->from('DE')->to('EN')->text('input') :

 <?php

namespace AppApi;


use AppApiHelperHasHtml;


class Translation
{

    use HttpRequest,
        HasHtml,
        ManageTranslations;


    public string $from = 'DE';

    public string $to = 'EN';

    public string $text = '';

    protected array $body;


    public function __construct()
    {

        $this->body = [
            'target_lang' => $this->to,
            'source_lang' => $this->from,
            'text'        => $this->text,
        ];

    }


    public static function translate() : self
    {

        return new static;
    }


    public function text( string $input )
    {

        $this->text = $input;

        // perform API call or somthing and return the result
    }


    public function from( string $language = 'DE' ) : self
    {

        $this->from = $language;

        return $this;
    }


    public function to( string $language = 'EN' ) : self
    {

        $this->to = $language;

        return $this;
    }
}
 

Но формулировка цепочки немного запутана и грязна.

Комментарии:

1. Нет, ваш класс не может проверить, есть ли какие-либо последующие цепочки. Период. Все, что вы возвращаете из своих методов, должно работать так, как оно есть, по своим собственным достоинствам. Например, путем реализации пользовательской строки для упорядочения любого текущего состояния. Кроме того, не пытайтесь быть слишком резким и сделать PHP буквально английским с дополнительной пунктуацией, это просто не так.

Ответ №1:

Я думаю, вы могли бы приблизиться к тому, что хотите, если измените порядок методов.

Предположим, у вас есть translateText($input) метод:

 $translator = new Translator('GER', 'ENG');
$english    = $translator->translateText('Ich bin ein Beliner.');
 

Теперь, используя то же translate() самое, вы можете изменить предыдущие настройки с помощью:

 $dutch = $translator->translateTo('DUT')
                    ->translateText('Ich bin ein Beliner.');
 

или

 $spanish = $translator->translateTo('SPA')
                      ->translateFrom('DUT')
                      ->translateText('De kat op het spek binden.');
 

Все методы используют цепочку, за исключением translateText($input) , поэтому вы используете этот метод как последний в цепочке.

Я не совсем уверен, что это полезно?

В данном случае я предпочитаю 3-буквенные языковые коды, потому что в данном случае они используются чаще, хотя также используется 2-буквенный код.

Я был бы несколько осторожен с использованием static PHP, хотя признаю, что сам его использую. Смотрите, например: Статические методы/переменные-плохая практика (мнения не всегда приветствуются при переполнении стека).