Анонимный вызов объекта в PHP?

Мне действительно не нужно хранить объект DateTime. Можно ли позвонить modify анонимно? Я пробовал:

$passwordRequest->setExpire((new \DateTime())->modify('+12 hours'));

Но не могу заставить его работать. Я прошу луну?


person gremo    schedule 18.11.2011    source источник
comment
В настоящее время обсуждается возможность включения: wiki.php.net/rfc/instance-method- позвонить   -  person Gordon    schedule 19.11.2011


Ответы (3)


Это ограничение PHP (во всяком случае, я так считаю), что вы должны вызывать методы для переменной. Другими словами, то, что вы пытаетесь сделать, невозможно.

person Corbin    schedule 18.11.2011
comment
Однако это возможно с PHP 5.4 :) - person mfonda; 19.11.2011
comment
Действительно? Ну наконец то! Мне всегда не хватало возможности сделать это на PHP :). - person Corbin; 19.11.2011
comment
Да, см. php.net/archive/2011.php#id2011. -11-11-1 - person John Cartwright; 19.11.2011

В этом конкретном случае вы можете использовать date_modify() вместо этого:

passwordRequest->setExpire(date_modify(new DateTime(), '+12 hours'));

Тестирование:

var_dump(date_modify(new DateTime(), '+12 hours'));

object(DateTime)#2 (3) {
  ["date"]=>
  string(19) "2011-11-19 04:16:04"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(15) "America/Chicago"
}

Как упоминалось в связанном дублирующем вопросе, вы не можете связать методы с экземпляром new.

person Michael Berkowski    schedule 18.11.2011
comment
Спасибо. Неправильный ответ (php не поддерживает цепочку), но я собираюсь использовать это. - person gremo; 19.11.2011

Согласно PHP, похоже, что вы можете вызывать modify() статически, но я пробовал, и это не сработает. Похоже, DateTime нужно создать, потому что конструктор принимает дату.

// According to PHP looks like it should work, but doesn't
$passwordRequest->setExpire((DateTime::modify('+12 hours'));

// Notice I have to pass a date to the construct when I instantiate
$date = new DateTime('2006-12-12');
$date->modify('+1 day');

Лучшей реализацией было бы сделать mod() статическим с двумя аргументами, один для даты и один для настройки времени, что-то вроде:

public static function modify($timeAdjust, $time = time()) 
person Mike Purcell    schedule 18.11.2011
comment
Все методы в руководстве перечислены как ClassName::methodName. Это не подразумевает статический метод. Статические методы имеют ключевое слово static в сигнатуре метода, ср. php.net/manual/en/datetime.createfromformat.php - person Gordon; 19.11.2011
comment
Думал, что это соглашение об именах, но попробовать стоило. - person Mike Purcell; 19.11.2011