Ошибка синтаксического анализа: 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 [..]

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

Author: Cyclone, 2012-04-03

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()
 2
Author: Frosty Z, 2012-04-03 15:17:12

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

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

Должно быть..

!$cache->is_cached();

То же самое с..

$cache::store

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

 3
Author: Lee Davis, 2012-04-03 15:08:43