Intereting Posts
Можно ли вставить строку, но только если значение еще не существует? Динамически отображать CSV-файл в виде таблицы HTML на веб-странице Как правильно добавить столбец shipping_description в сетке заказа magento? Никогда не запускайте «композиторское обновление» в производстве, почему? Google Adwords: настройка не загружается должным образом Данные Swift httppost, не вставляемые в базу данных MySQL изображение с изображениями, используя собственный формат http-адаптера Сессия: Конфигурированные файлы драйверов не найдены. Aborting CData в simplexml открыт из XMLReader Проверьте, существует ли экземпляр класса, если не создать экземпляр Является ли добавление PHP уязвимым для SQL-инъекции? Веб-приложение – слайдер, показывающий функции дней месяца Как преобразовать mysql в sqlite3 с помощью PHP Использование $ .post для отправки JS-переменных в PHP-скрипт Многопользовательская одна очередь

вызов метода объекта при создании экземпляра

В PHP почему я не могу:

class C { function foo() {} } new C()->foo(); 

но я должен сделать:

 $v = new C(); $v->foo(); 

На всех языках я могу это сделать …

В PHP вы не можете вызвать произвольный метод для только что созданного объекта, например new Foo()->someMethod();

Извините, но так оно и есть.

Но вы можете построить такую ​​работу:

 <?php class CustomConstructor { public static function customConstruct($methodName) { $obj = new static; //only available in PHP 5.3 or later call_user_method($methodName, $obj); return $obj; } } 

Расширьте CustomContructor следующим образом:

 class YourClass extends CustomConstructor { public function someCoolMethod() { //cool stuff } } 

И создайте их так:

 $foo = YourClass::customConstruct('someCoolMethod'); 

Я не тестировал его, но это или что-то вроде этого должно работать.

Исправление: это будет работать только в PHP 5.3 и более поздних версиях, так как требуется поздняя статическая привязка.

Начиная с PHP 5.4 вы можете сделать

 (new Foo)->bar(); 

До этого это невозможно. Видеть

  • Один из многих вопросов, задающих то же самое по SO
  • Обсуждение внутри PHP
  • Другая дискуссия по внутренним PHP
  • Соответствующий запрос функции в BugTracker

Но у вас есть несколько альтернатив

Невероятно уродливое решение я не могу объяснить:

 end($_ = array(new C))->foo(); 

Бессмысленный Сериализовать / Unserialize только для того, чтобы иметь возможность цепочки

 unserialize(serialize(new C))->foo(); 

Точно бессмысленный подход с использованием Reflection

 call_user_func(array(new ReflectionClass('Utils'), 'C'))->foo(); 

Несколько более здравый подход с использованием функций как фабрики:

 // global function function Factory($klass) { return new $klass; } Factory('C')->foo() // Lambda PHP < 5.3 $Factory = create_function('$klass', 'return new $klass;'); $Factory('C')->foo(); // Lambda PHP > 5.3 $Factory = function($klass) { return new $klass }; $Factory('C')->foo(); 

Наиболее разумный подход с использованием метода Factory Method Pattern Solution:

 class C { public static function create() { return new C; } } C::create()->foo(); 

Из PHP 5.4 вы можете: (new Foo())->someMethod();

Вы не сможете выполнять код как

new C()->foo();

на других языках, по крайней мере, не до тех пор, пока этот язык точно следует логике. Объект создается не только с помощью C() , но и с полным new C() . Поэтому вы должны гипотетически иметь возможность выполнить этот код, если вы включаете другую пару круглых скобок: (new C())->foo();

(Будьте осторожны: я не тестировал выше, я просто говорю, что это должно гипотетически работать.)

Большинство языков (с которыми я столкнулся) справляются с этой ситуацией одинаково. C, C #, Java, Delphi …

Я пробовал это и добился успеха –

 <?php $obj = new test("testFunc"); class test{ function __construct($funcName){ if(method_exists($this, $funcName)){ self::$funcName(); } } function testFunc(){ echo "blah"; return $this; } } ?>