Разница между объектом Carbon, вставленным в БД и напечатанным на PHP - PullRequest
0 голосов
/ 26 декабря 2018

У меня есть сомнение, если я создаю объект Carbon в PHP с помощью Carbon: now () и вставляю его в свою БД, строка показывает «2018-12-26 14:56:00», но если я его распечатаюдает мне углеродный объект, почему это происходит?

1 Ответ

0 голосов
/ 27 декабря 2018

Глядя на исходный код (кратко)

/**
 * Default format to use for __toString method when type juggling occurs.
 *
 * @var string
 */
public const DEFAULT_TO_STRING_FORMAT = 'Y-m-d H:i:s';

И я знаю, магический метод __toString вызывается при выводе, например echo или print, но не var_dump, var_export и print_r.Но на самом деле это влияет на приведение объекта к строке (на самом деле не зависит от вывода).Просто при использовании таких вещей, как var_dump и «friends», сначала не преобразуется в строку.

Например, мы можем «доказать это» довольно легко

class foo{

    public function __toString(){
        return "foo";
    }
}

$f = new foo;

print_r($f);

echo "\n";

echo $f;

echo "\n\n";

print_r((string)$f);

Output

foo Object //output from print_r
(
) 

foo //output from echo

foo //output from casting to string and print_r

Итак, чтобы ответить на ваш вопрос, это потому, что вы используете что-то другое, чем echo, и класс предназначен для вывода этого при преобразовании его в строку.

Так что, как только выв сочетании с этим небольшим фрагментом, который я нашел в исходном коде, все это имеет смысл.

    1. Вы выводите его таким образом, чтобы не преобразовывать его в строку
  • Когда он конвертируется в строку, он предназначен для использования этого формата.

И даже не смотря на метод toString, могу поспорить, он содержит что-то вроде этого:

public function __toString(){
    return $this->format(static::DEFAULT_TO_STRING_FORMAT); //or self::
} 

И на самом деле (после некоторого копания) мы находим его в «Черте» Здесь

public function __toString()
{
    $format = $this->localToStringFormat ?? static::$toStringFormat;
    return $format instanceof Closure
        ? $format($this)
        : $this->format($format ?: (
            defined('static::DEFAULT_TO_STRING_FORMAT')
                ? static::DEFAULT_TO_STRING_FORMAT
                : CarbonInterface::DEFAULT_TO_STRING_FORMAT
        ));
}

Я также могу сказать (Посмотрев на это) что вы, вероятно, можете установить один из этих 2:

 $this->localToStringFormat
 static::$toStringFormat

, чтобы переопределить это поведение (либо как функцию anon, либо как вызов своего собственного метода формата), того, какой формат он возвращает при приведениив строку.

И я никогда раньше не использовал Carbon !!

Ура.

песочница

...