Я бы хотел сделать что-то вроде этого:
$method_result = new Obj()->method();
Вместо того, чтобы делать:
$obj = new Obj();
$method_result = $obj->method();
В моем конкретном случае результат для меня не имеет значения. Но есть ли способ сделать это?
my_method
следует ли вместо этого декларироватьstatic
.Ответы:
Запрошенная вами функция доступна в PHP 5.4. Вот список новых возможностей PHP 5.4:
http://php.net/manual/en/migration54.new-features.php
И соответствующая часть из списка новых функций:
источник
(new Foo)->property
если захотите.(new Foo)->property
- сохраненному вами значению некуда деваться, потому что после этого объект больше не будет существовать, поскольку он нигде не хранится.return $this
в свои сеттеры. Это также позволит вам подключать сеттеры.Вы не можете делать то, о чем просите; но вы можете «обмануть», используя тот факт, что в PHP вы можете иметь функцию с тем же именем, что и класс; эти имена не будут конфликтовать.
Итак, если вы объявили такой класс:
Затем вы можете объявить функцию, которая возвращает экземпляр этого класса и имеет то же имя, что и класс:
И теперь становится возможным использовать однострочник, как вы и просили - единственное, что вы вызываете функцию, тем самым не используя new:
И это работает: вот, я получаю:
как выход.
И, что еще лучше, вы можете добавить в свою функцию какой-нибудь phpdoc:
Таким образом, у вас даже будут подсказки в вашей IDE - по крайней мере, с Eclipse PDT 2.x; см. снимок:
Изменить 2010-11-30: просто для информации, несколько дней назад был представлен новый RFC, в котором предлагается добавить эту функцию в одну из будущих версий PHP.
См .: Запрос комментариев: вызов экземпляра и метода / доступ к свойству
Так что, возможно, такие вещи будут возможны в PHP 5.4 или другой будущей версии:
источник
Вы можете сделать это более универсально, определив функцию идентификации:
Таким образом, вам не нужно определять функцию для каждого класса.
источник
Как насчет:
:П
источник
Нет, это невозможно.
Вам необходимо назначить экземпляр переменной, прежде чем вы сможете вызвать какой-либо из ее методов.
Если вы действительно не хотите этого делать, вы можете использовать фабрику, как предлагает ropstah:
источник
public static function
вместоpublic function
. Рекомендуется использовать статику?Вы можете использовать статический фабричный метод для создания объекта:
источник
Я тоже искал однострочник, чтобы выполнить это как часть одного выражения для преобразования дат из одного формата в другой. Мне нравится делать это одной строчкой кода, потому что это единственная логическая операция. Это немного загадочно, но позволяет создавать и использовать объект даты в одной строке:
Другой способ однострочного преобразования строк даты из одного формата в другой - использовать вспомогательную функцию для управления ОО-частями кода:
Я считаю, что объектно-ориентированный подход - это круто и необходимо, но иногда он может быть утомительным, требуя слишком много шагов для выполнения простых операций.
источник
Я вижу, что это довольно старый вопрос, но вот что, я думаю, следует упомянуть:
Специальный метод класса «__call ()» может использоваться для создания новых элементов внутри класса. Вы используете это так:
Результат должен быть:
Таким образом, вы можете обманом заставить PHP создать «новую» команду внутри вашего класса верхнего уровня (или любого другого класса на самом деле) и поместить свою команду include в функцию __call (), чтобы включить класс, который вы просили. Конечно, вы, вероятно, захотите протестировать $ func, чтобы убедиться, что это «новая» команда, которая была отправлена команде __call (), и (конечно) у вас могут быть другие команды также из-за того, как работает __call ().
источник
Просто мы можем это сделать
источник