これは私のコントローラーで動作します。
$this->load->driver('cache');
//working
// $data['advisory']=$advisory = $this->cache->memcached->get('advisory');
// if(! $advisory)
// {
//     $data['advisory']=$advisory = $this->Mhomework->getbyadvisory($this->teacherid);
//     $this->cache->memcached->save('advisory' , $advisory);
// }
他の人に使用できるように、次のようにこれを作成するためのライブラリを作成しました。
function cache($key, $data) 
{
    $this->CI->load->driver('cache');
    $cache = $this->CI->cache->memcached->get($key);
    if (!$cache) {
        // There's been a miss, so run our data function and store it
        $cache = $data($CI);
        //$cache = $data;
        $this->CI->cache->memcached->save($key, $cache);
    }
    return $cache;
}
そして、コントローラーで次のように変更すると、エラーが発生します。
$data['advisory'] = $this->hwtracker->cache('advisory.'.$this->teacherid, function(&$CI){
        return $CI->Mhomework->getbyadvisory($this->teacherid);
    });
// error  Call to a member function getbyadvisory() on a non-object in ... controller
// Message: Trying to get property of non-object
私の質問は、CodeIgniter でライブラリに関数を送信する方法です。それともできますか?
アップデート:
function getbyadvisory($id){
          $Q="SELECT *, studentid, COUNT(studentid),be_user_profiles.first_name,   
       be_user_profiles.last_name
            FROM be_user_profiles
            LEFT JOIN hw_homework
            ON be_user_profiles.user_id= hw_homework.studentid
            WHERE be_user_profiles.advisor = $id
            GROUP BY be_user_profiles.user_id
            ORDER BY COUNT(studentid) DESC";
        $query = $this->db->query($Q);
        if ($query->num_rows() > 0)
        {
            foreach ($query->result_array() as $row)
            {
                $data[] = $row;
            }
        }
        else
        {
            $data = FALSE;
        }
        $query->free_result();
        return $data;
    }