top-think / think-orm

Think ORM——the PHP Database&ORM Framework
Apache License 2.0
413 stars 171 forks source link

formatDateTime处理'datetime_format' => '\\app\\common\\util\\ModelDateTime'的问题 #603

Open uniquekey-coder opened 1 month ago

uniquekey-coder commented 1 month ago
    /**
     * 时间日期字段格式化处理.
     *
     * @param mixed $format    日期格式
     * @param mixed $time      时间日期表达式
     * @param bool  $timestamp 时间表达式是否为时间戳
     *
     * @return mixed
     */
    protected function formatDateTime($format, $time = 'now', bool $timestamp = false)
    {
        if (empty($time)) {
            return $time;
        }

        if (false === $format) {
            return $time;
        } elseif (str_contains($format, '\\')) {
            //如果$format传递的是类,这里返回的是类实例化的对象?是否应该是 return (string)new $format($time);调用__toString()方法
            return new $format($time);
        }

        if ($time instanceof DateTimeInterface) {
            $dateTime = $time;
        } elseif ($timestamp) {
            $dateTime = new DateTime();
            $dateTime->setTimestamp(is_numeric($time) ? (int) $time : strtotime($time));
        } else {
            $dateTime = new DateTime($time);
        }

        return $dateTime->format($format);
    }

这里的代码是不是有问题,在数据库配置中, 'datetime_format' => '\app\common\util\ModelDateTime',我传递的类,最终返回的是一个对象。这应该是一个历史遗留问题,在thinkphp view视图中,使用的是 echo $object,会自动调用toString(),但如果不是在view中,就不会调用toString()了,所以 return new $format($time) 会得到结果 “{}”

           if (false === $format) {
            return $time;
        } elseif (str_contains($format, '\\')) {
            //如果$format传递的是类,这里返回的是类实例化的对象?是否应该是 return (string)new $format($time);调用__toString()方法
            return new $format($time);
        }