В PHP, вы можете создать объект и вызвать метод в одной строке?
что я хотел бы сделать что-то вроде этого:
$method_result = new Obj()->method();
вместо того, чтобы делать:
$obj = new Obj();
$method_result = $obj->method();
результат на самом деле не имеет значения для меня в моем конкретном случае. Но, есть ли способ сделать это?
8 ответов:
вы просили доступна из PHP 5.4. Вот список новых функций в PHP 5.4:
http://php.net/manual/en/migration54.new-features.php
и соответствующая часть из списка новых функций:
добавлен доступ к члену класса при создании экземпляра, например (new Foo) - > bar ().
вы не можете делать то, что просите ; но вы можете "обмануть", используя тот факт, что в 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); }
и теперь, становится возможным использовать один-лайнер, как ты и просил, только вы вызываете функцию, таким образом, не используя новые :
$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]
вы можете сделать это более универсально, определив функцию идентификации:
function identity($x) { return $x; } identity(new Obj)->method();
таким образом, вам не нужно определять функцию для каждого класса.
нет, это невозможно.
Вам нужно назначить экземпляр переменной, прежде чем вы сможете вызвать любой из ее методов.Если вы действительно не хотите этого делать, вы можете использовать фабрику, как предлагает ropstah:
class ObjFactory{ public static function newObj(){ return new Obj(); } } ObjFactory::newObj()->method();
вы можете использовать статический заводской метод для создания объекта:
ObjectFactory::NewObj()->method();
Я тоже искал команду, чтобы выполнить это в рамках одного выражения для преобразования дат из одного формата в другой. Мне нравится делать это в одной строке кода, потому что это одна логическая операция. Таким образом, это немного загадочно, но это позволяет создавать и использовать объект даты в одной строке:
$newDateString = ($d = new DateTime('2011-08-30') ? $d->format('F d, Y') : '');
другой способ однострочного преобразования строк даты из одного формата в другой - использовать вспомогательную функцию для управления частями OO код:
function convertDate($oldDateString,$newDateFormatString) { $d = new DateTime($oldDateString); return $d->format($newDateFormatString); } $myNewDate = convertDate($myOldDate,'F d, Y');
Я думаю, что объектно-ориентированный подход крут и необходим, но иногда он может быть утомительным, требуя слишком много шагов для выполнения простых операций.
Я вижу, что это довольно старый, как вопросы идут, но вот что я думаю, следует упомянуть:
специальный метод класса, называемый " __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