“Встроенное” инстанцирование класса в PHP? (Для простоты объединения в цепочку метода)

Другим вариантом является использование негативного взгляда:

:%s/\v^((here)@!.)* here//

\v используется для очень волшебства , чтобы избежать побега в регулярном выражении.

8
задан Max Cantor 9 October 2008 в 15:57
поделиться

4 ответа

Все эти предлагаемые решения усложняют Ваш код для изгиба PHP для выполнения некоторой синтаксической точности. Желание, чтобы PHP был чем-то, что это не (как польза), является путем к безумию.

Я просто использовал бы:

$u = new User();
$s = $u->login()->get_db_data()->get_session_data();

Это ясно, относительно кратко и не включает черной магии, которая может представить ошибки.

И конечно, Вы могли всегда перемещаться в Ruby или Python. Это изменит Вашу жизнь.

  • И да, я резок на PHP. Я использую его каждый день. Использование его в течение многих лет. Действительность - то, что это срослось, а не было разработано, и это показывает.
12
ответ дан 3 November 2019 в 12:57
поделиться
<?php

    class User
    {
        function __construct()
        {
        }

        function Login()
        {
            return $this;
        }

        function GetDbData()
        {
            return $this;
        }

        function GetSession()
        {
            return array("hello" => "world");
        }
    }

    function Create($name)
    {
        return new $name();
    }

    $s = Create("User")->Login()->GetDbData()->GetSession();

    var_dump($s);
?>

Это - возможное решение :) Конечно, необходимо выбрать лучшее название функции...

Или если Вы не возражаете против немного служебного:

<?php

    class User
    {
        function __construct($test)
        {
            echo $test;
        }
...
    }

    function CreateArgs($name)
    {
        $ref = new ReflectionClass($name);
        return $ref->newInstanceArgs(array_slice(func_get_args(), 1));
    }

    $s = CreateArgs("User", "hi")->Login()->GetDbData()->GetSession();

    var_dump($s);
?>
8
ответ дан 3 November 2019 в 12:57
поделиться

Единственным путем можно добраться, что-то подобное с одноэлементным статическим методом или фабрикой. Например:

class User
{
    //...
    /**
     *
     * @return User
     */
    public static function instance()
    {
        $args = func_get_args();
        $class = new ReflectionClass(__CLASS__);
        return $class->newInstanceArgs($args);
    }
    //...
}

Это использует API Reflection PHP5 для создания нового экземпляра (использующий любой args, отправленный в:: экземпляр ()) и возвраты это разрешающий Вам сделать объединение в цепочку:

$s = User::instance()->login()->get_db_data()->get_session_data();

По тому, как код достаточно гибок, что единственной вещью, которую необходимо будет изменить при копировании того статического метода, является @return комментария PHPDoc.


Если Вы хотите преждевременно оптимизировать свой код как наш друг Nelson, можно заменить содержание Пользователя:: экземпляр () с:

return new self();
4
ответ дан 3 November 2019 в 12:57
поделиться

Нет причин объединять хак (для обхода синтаксической проблемы) и сам код создания объекта.

Поскольку новое-выражение не может использоваться в качестве левого члена оператора объекта, а выражение вызова функции можно, вам нужно только заключить ваш объект в вызов функции, которая возвращает свой собственный аргумент:

function hack($obj) { return $obj; }

$mail = hack(new Zend_Mail())
  -> setBodyText('This is the text of the mail.')
  -> setFrom('somebody@example.com', 'Some Sender')
  -> addTo('somebody_else@example.com', 'Some Recipient')
  -> setSubject('TestSubject');
5
ответ дан 3 November 2019 в 12:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: