Ошибка синтаксического анализа: T PAAMAYIM НЕКУДОТАИМ
Я настроил этот простой класс кэша как библиотеку в Codeigniter:
<?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 [..]
Я предполагаю, что это что-то связанное с двойными точками и статической функцией, но я новичок в классах, так в чем проблема?
2 answers
Вы должны использовать вызовы статики (::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;
}
}
ИМО, класс Easy_cache
следует использовать так, как вы пытались, но:
- используйте
->
вместо::
для вызовов методов - удалите все
static
ключевые слова в определения методов - (необязательно, но рекомендуется) переименовать метод
Easy_cache()
в метод__construct()
Вы смешиваете вызов экземпляра со статическими вызовами.
$cache = $this->easy_cache;
!$cache::is_cached
Должно быть..
!$cache->is_cached();
То же самое с..
$cache::store
Вы либо работаете в контексте объекта (используя $this), либо выполняете статический вызов (используя::). Вы не можете их смешивать.