Ошибка autoload при использовании namespace

Уже исправленные репорты или принятые предложения
Закрыто
lehandr
Сообщения: 12
Зарегистрирован: 2011.05.25, 21:51

Ошибка autoload при использовании namespace

Сообщение lehandr »

Используется Denwer с PHP 5.3.1
Все настройки Yii — по умолчанию.

Есть класс Timestamp, расположенный в protected\utils\Timestamp.php

Код: Выделить всё

<?php
namespace application\utils;
 
class Timestamp
{
    /**
     * @return integer get local time zone offset with dst from UTC
     */
    public static function getUTCDiff()
    {
        static $OFFSET;
        if (isset($OFFSET)) return $OFFSET;

        $tz = new DateTimeZone(Yii::app()->timeZone);
        // получаем текущий офсет времени в секундах от UTC/GMT+0 (здесь летнее время уже учтено)
        $OFFSET = $tz->getOffset(new DateTime('now', new DateTimeZone('UTC')));

        return $OFFSET;
    }
}
?>
Использовать его пытаюсь в контроллере SiteController.php:

Код: Выделить всё

<?php
use application\utils\Timestamp as T;
...

public function actionIndex()
{
    // renders the view file 'protected/views/site/index.php'
    // using the default layout 'protected/views/layouts/main.php'
    
    Yii::app()->timeZone = 'America/New_york';
    date_default_timezone_set(Yii::app()->timeZone);
    $tzOffset = T::getUTCDiff()/3600;
        
    $this->render('index');
}
?>
Класс \application\utils\Timestamp подключается замечательно, но при вторичном входе в метод YiiBase::autoload($className) для нахождения встроенного класса DateTimeZone, вылазит ошибка вида:
include(Z:\home\SITENAME\www\protected\utils\DateTimeZone.php) [<a href='function.include'>function.include</a>]: failed to open stream: No such file or directory.

Первый раз пробую работать с namespace, поэтому не уверен, что это ошибка. Но если все-таки это ошибка, то причина, по-моему, в том, что в методе YiiBase::autoload($className) нет проверки на существование класса $className "самого по себе" (вне импортированного namespace).
mrix
Сообщения: 125
Зарегистрирован: 2010.08.30, 11:48
Откуда: Россия, Новосибирск

Re: Ошибка autoload при использовании namespace

Сообщение mrix »

Код: Выделить всё

new \DateTimeZone(Yii::app()->timeZone) 
lehandr
Сообщения: 12
Зарегистрирован: 2011.05.25, 21:51

Re: Ошибка autoload при использовании namespace

Сообщение lehandr »

mrix писал(а):

Код: Выделить всё

new \DateTimeZone(Yii::app()->timeZone) 
Я уже так пробовал, но в результате получаем другую ошибку:

include(Z:\home\SITENAME\www\protected\utils\Yii.php) [<a href='function.include'>function.include</a>]: failed to open stream: No such file or directory
mrix
Сообщения: 125
Зарегистрирован: 2010.08.30, 11:48
Откуда: Россия, Новосибирск

Re: Ошибка autoload при использовании namespace

Сообщение mrix »

Внутри namespace'ов тебе надо вызывать все классы с префиком \

Код: Выделить всё

\Yii::trace(__METHOD__) 
lehandr
Сообщения: 12
Зарегистрирован: 2011.05.25, 21:51

Re: Ошибка autoload при использовании namespace

Сообщение lehandr »

mrix писал(а):Внутри namespace'ов тебе надо вызывать все классы с префиком \

Код: Выделить всё

\Yii::trace(__METHOD__) 
Спасибо, mrix! Проблема решена.
Закрыто