Что за хрень с DateTime

hell0w0rd

Продвинутый новичок
clone нефига не clone. Возвращает не новый а тот же самый объект. Ок.
PHP:
$dt = new Date('2013-09-01');
$clone = clone $dt;
$clone->add(new DateInterval('P7D'));
var_dump($dt, $clone);

class Date
{
    private $dateTime;

    public function __construct($date)
    {
        $this->dateTime = new DateTime($date);
    }

    public function __clone()
    {
        $clone = new self($this->dateTime->format('Y-m-d'));

        return $clone;
    }

    public function add($interval)
    {
        $this->dateTime->add($interval);
    }
}
Кстати унаследоваться тоже невозможно... и вот результат:
PHP:
$ php -v
PHP 5.5.4 (cli) (built: Sep 21 2013 13:40:55) 
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.5.0, Copyright (c) 1998-2013 Zend Technologies
    with Xdebug v2.2.3, Copyright (c) 2002-2013, by Derick Rethans
$ php index.php
class Date#12 (1) {
  private $dateTime =>
  class DateTime#13 (3) {
    public $date =>
    string(19) "2013-09-08 00:00:00"
    public $timezone_type =>
    int(3)
    public $timezone =>
    string(13) "Europe/Moscow"
  }
}
class Date#14 (1) {
  private $dateTime =>
  class DateTime#13 (3) {
    public $date =>
    string(19) "2013-09-08 00:00:00"
    public $timezone_type =>
    int(3)
    public $timezone =>
    string(13) "Europe/Moscow"
  }
}
В ядре какая-то ошибка, что datetime может быть один на процесс, или я что-то не так делаю?
 

Breeze

goshogun
Команда форума
Партнер клуба
читай доку

PHP:
function __clone()
    {
        // Force a copy of this->object, otherwise
        // it will point to same object.
        $this->object1 = clone $this->object1;
    }
 

hell0w0rd

Продвинутый новичок
Хм. Если clone не возрващает новый инстанс, кака разница между clone и =?
 

флоппик

promotor fidei
Команда форума
Партнер клуба
Хм. Если clone не возрващает новый инстанс, кака разница между clone и =?
чувак, о чем ты? в доке написано же
По завершении клонирования, если у класса был определен метод __clone(), то этот метод __clone() вызывается у свежесозданной копии объекта, для возможного изменения всех необходимых свойств.
 
Сверху