В PHP вы можете создать экземпляр объекта и вызвать метод в той же строке?

Я хотел бы сделать что-то вроде этого:

$method_result = new Obj()->method();

Вместо того, чтобы делать:

$obj = new Obj();
$method_result = $obj->method();

Результат на самом деле не имеет значения для меня в моем конкретном случае. Но есть ли способ сделать это?

105 голосов | спросил weotch 10 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 10 Sep 2009 02:38:00 +0400 2009, 02:38:00

8 ответов


0

Запрошенная вами функция доступна в PHP 5.4. Вот список новых функций в PHP 5.4:

http://php.net/manual/ru/migration54.new features.php

И соответствующая часть из списка новых функций:

  

Добавлен доступ к членам класса при создании экземпляра, Например, (новый Foo) -> bar ().

ответил Delian Krustev 9 PMpMon, 09 Apr 2012 16:07:16 +040007Monday 2012, 16:07:16
0

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

Итак, если вы объявили класс следующим образом:

class Test {
    public function __construct($param) {
        $this->_var = $param;
    }
    public function myMethod() {
        return $this->_var * 2;
    }
    protected $_var;
}

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

function Test($param) {
    return new Test($param);
}

И теперь становится возможным использовать однострочник, как вы и просили - единственное, что вы вызываете функцию, то есть не используете new:

$a = Test(10)->myMethod();
var_dump($a);

И это работает: вот, я получаю:

int 20

как вывод.


И, что лучше, вы можете добавить phpdoc в свою функцию:

/**
 * @return Test
 */
function Test($param) {
    return new Test($param);
}

Таким образом, вы даже будете иметь подсказки в своей IDE - по крайней мере, с Eclipse PDT 2.x; увидеть скриншот:

http://extern.pascal-martin.fr/so/class-and-function.png



Изменить 2010-11-30: Просто для сведения, несколько дней назад был представлен новый RFC, предлагающий добавить эту функцию в одну из будущих версий PHP.

См. Запрос комментариев: доступ к экземпляру и вызову метода /доступ к свойству

Так что, возможно, что-то подобное будет возможно в PHP 5.4 или другой будущей версии:

(new foo())->bar()
(new $foo())->bar
(new $bar->y)->x
(new foo)[0]
ответил Pascal MARTIN 10 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 10 Sep 2009 02:44:33 +0400 2009, 02:44:33
0

Вы можете сделать это более универсально, определив функцию тождества:

function identity($x) {
    return $x;
}

identity(new Obj)->method();

Таким образом, вам не нужно определять функцию для каждого класса.

ответил Tom Pažourek 13 J000000Wednesday11 2011, 04:43:48
0

Как насчет:

$obj = new Obj(); $method_result = $obj->method(); // ?

: р

ответил Jeff 10 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 10 Sep 2009 02:40:50 +0400 2009, 02:40:50
0

Нет, это невозможно.
Вам нужно присвоить экземпляр переменной, прежде чем вы сможете вызвать любой из ее методов.

Если вы действительно не хотите этого делать, вы можете использовать фабрику, как подсказывает ропстах:

class ObjFactory{
  public static function newObj(){
      return new Obj();
  }
}
ObjFactory::newObj()->method();
ответил Pim Jager 10 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 10 Sep 2009 02:38:28 +0400 2009, 02:38:28
0

Вы можете использовать статический фабричный метод для создания объекта:

ObjectFactory::NewObj()->method();
ответил Ropstah 10 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 10 Sep 2009 02:40:05 +0400 2009, 02:40:05
0

Я тоже искал однострочник для выполнения этого как часть одного выражения для преобразования дат из одного формата в другой. Мне нравится делать это в одной строке кода, потому что это одна логическая операция. Итак, это немного загадочно, но оно позволяет вам создавать и использовать объект даты в одной строке:

$newDateString = ($d = new DateTime('2011-08-30') ? $d->format('F d, Y') : '');

Другой способ однострочного преобразования строк даты из одного формата в другой - использование вспомогательной функции для управления ОО-частями кода:

function convertDate($oldDateString,$newDateFormatString) {
    $d = new DateTime($oldDateString);
    return $d->format($newDateFormatString);
}

$myNewDate = convertDate($myOldDate,'F d, Y');

Я думаю, что объектно-ориентированный подход крут и необходим, но иногда он может быть утомительным, требуя слишком много шагов для выполнения простых операций.

ответил CodeCavalier 1 stEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 01 Sep 2011 19:48:08 +0400 2011, 19:48:08
0

Я вижу, что это довольно старый вопрос, но есть кое-что, что, я думаю, следует упомянуть:

Специальный метод класса с именем "__call ()" можно использовать для создания новых элементов внутри класса. Вы используете это так:

<?php
class test
{

function __call($func,$args)
{
    echo "I am here - $func\n";
}

}

    $a = new test();
    $a->new( "My new class" );
?>

Вывод должен быть:

I am here - new

Таким образом, вы можете обмануть PHP для создания «новой» команды внутри вашего класса верхнего уровня (или любого другого класса) и поместить вашу команду include в функцию __call (), чтобы включить класс, который вы запросили. Конечно, вы, вероятно, захотите протестировать $ func, чтобы убедиться, что это «новая» команда, отправленная команде __call (), и (конечно) у вас могут быть другие команды также из-за работы __call (). /р>

ответил Mark Manning 7 Jam1000000amThu, 07 Jan 2016 09:27:34 +030016 2016, 09:27:34

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132