2012-04-03 3 views
2

Я получил этот простой класс кэша выставиться в качестве библиотеки в Codeigniter:Ошибка синтаксического анализа: T_PAAMAYIM_NEKUDOTAYIM

<?php 

class Easy_cache { 

    static public $expire_after; 

    static function Easy_cache() 
    { 
     if ($this->expire_after == '') 
     { 
      $this->expire_after = 300; 
     } 
    } 

    static function store($key, $value) 
    { 
     $key = sha1($key); 
     $value = serialize($value); 
     file_put_contents(BASEPATH.'cache/'.$key.'.cache', $value); 
    } 

    static function is_cached($key) 
    { 
     $key = sha1($key); 
     if (file_exists(BASEPATH.'cache/'.$key.'.cache') && (filectime(BASEPATH.'cache/'.$key.'.php')+$this->expire_after) >= time()) 
      return true; 

     return false; 
    } 

    static function get($key) 
    { 
     $key = sha1($key); 
     $item = file_get_contents(BASEPATH.'cache/'.$key.'.cache'); 
     $items = unserialize($item); 

     return $items; 
    } 

    static function delete($key) 
    { 
     unlink(BASEPATH.'cache/'.sha1($key).'.cache'); 
    } 

} 

Я хочу использовать его сейчас, так что в контроллере я использую это (я загрузка библиотека через autoload.php):

class Main extends CI_Controller 
{ 
    public function __construct() 
    { 

     parent::__construct(); 
    } 

    public function index() 
    { 
     $cache = $this->easy_cache; 
     if (!$cache::is_cached('statistics')) 
     { 
      $data = array('data' => $this->model_acc->count()); 
      $cache::store('server_statistics', $data); 
     } 
     else 
      $data = array('this' => 'value'); 

     $this->load->view('main', array('servers' => $this->servers->get())); 
    } 
} 

И тогда я получаю эту ошибку:

Parse error: syntax error, unexpected T_PAAMAYIM_NEKUDOTAYIM in [..] 

I г uess его что-то связанное с двойными точками и статической функцией, но я новичок с классами, так что проблема?

+0

'неожиданный T_PAAMAYIM_NEKUDOTAYIM в' ... где? не могли бы вы выделить выделенную строку? –

+0

Там: 'if (! $ Cache :: is_cached ('статистика'))'. – Cyclone

+0

Где находится '$ this-> easy_cache'? – MichaelRushton

ответ

2

Вы должны использовать вызовы statics (::someMethod()) с именем класса, а не экземпляром класса.

Поскольку все методы Easy_cache статичны, вы должны сделать

Easy_cache::is_cached() 
Easy_cache::store() 

вместо

$cache::is_cached() 
$cache::store() 

Кстати, вы уверены, что это происходит от CodeIgniter кодового? Это смешивает статический и динамический контекст:

static function Easy_cache() 
{ 
    if ($this->expire_after == '') 
    { 
     $this->expire_after = 300; 
    } 
} 

IMO, класс Easy_cache следует использовать, как вы пытались, но:

  • использование -> вместо :: для вызовов метода
  • удалить все static ключевые слова в определения методов
  • (необязательно, но рекомендуется) переименовать Easy_cache() метод __construct()
+0

Спасибо, вы все объяснили :).И вы правы, ошибка не исходит из кодов CodeIgniter - измененных тегов. Спасибо. – Cyclone

3

Смешивание вызова экземпляра со статическими вызовами.

$cache = $this->easy_cache; 
!$cache::is_cached 

должен быть ..

!$cache->is_cached(); 

же с ..

$cache::store 

Вы либо работают в контексте объекта (с помощью $ это), или выполнить статический вызов (используя: :). Вы не можете их смешивать.

+0

Ладно, спасибо, но почему я видел много классов, которые я мог бы использовать через двойные точки ... почему я не могу использовать их здесь? – Cyclone

+0

Двойной двоеточие (aka Paamayim Nekudotayim) относится к статическим методам/свойствам. «->» для всего остального. –

+0

'is_cached()' статично. Поэтому он должен работать нормально. – MichaelRushton