为什么有些类没有从CodeIgniter上的库中加载

时间:2012-05-22 14:24:00

标签: php codeigniter autoload bootstrapping evernote

我正在尝试将Evernote SDK集成到我的CodeIgniter Web应用程序中,并且库中的某些类已加载而其他类没有,: - 我无法理解为什么。

我有一段简单的代码:

$access_token = 'my validated access token ';

// Get User Store
$userStoreTrans;
try{
    $userStoreTrans = new THttpClient(USER_STORE_HOST, USER_STORE_PORT, USER_STORE_URL, USER_STORE_PROTO);
}
catch(TTransportException $e)
{
    print $e->errorCode.' Message:'.$e->parameter;
}

$userStoreProt = new TBinaryProtocol($userStoreTrans);
$userStoreClient = new UserStoreClient($userStoreProt, $userStoreProt);

正确创建$userStoreTrans$userStoreProt后,来自Evernote SDK的THttpClientTBinaryProtocol个类,$userStoreClient会抛出Class 'UserStoreClient' not found in .../home.php

我不明白为什么某些类被识别而其他类没有被识别,我可以看到的主要区别是“TClasses”位于evernote-sdk-php/lib/transport/*.phpevernote-sdk-php/lib/protocol/*.php之下,而UserStoreClient有一个额外的文件夹{ {1}}

我将解释如何将evernote-sdk-php包含在我的CodeIgniter安装中:

这是我的CodeIgniter config / autoload.php

evernote-sdk-php/lib/packages/UserStore/*.php

这是我的Evernote_bootstrap.php文件

$autoload['libraries'] = array('database','session','form_validation','security','tank_auth','Evernote_bootstrap');

Evernote_Bootstrap类的主要目的是<?php if (!defined('BASEPATH')) exit('No direct script access allowed'); define("EVERNOTE_LIBS", dirname(__FILE__) . DIRECTORY_SEPARATOR . "evernote-sdk-php/lib"); // add ourselves to include path ini_set("include_path", ini_get("include_path") . ":" . EVERNOTE_LIBS); require_once("evernote-sdk-php/lib/autoload.php"); require_once("evernote-oauth/functions.php"); class Evernote_Bootstrap { function __construct() { // log_message('debug','Evernote_Bootstrap'); } } ?> ,这个类是使用-phpa Thrift生成器标志自动生成的,我只添加一些日志来查看问题。

autoload.php:

require_once of evernote-sdk-php/lib/autoload.php

然后我记录了该库,似乎工作正常。您可以看到主要的重要日志:<?php /** * Copyright (c) 2006- Facebook * Distributed under the Thrift Software License * * See accompanying file LICENSE or visit the Thrift site at: * http://developers.facebook.com/thrift/ * * @package thrift * @author Mark Slee <mcslee@facebook.com> */ /** * Include this file if you wish to use autoload with your PHP generated Thrift * code. The generated code will *not* include any defined Thrift classes by * default, except for the service interfaces. The generated code will populate * values into $GLOBALS['THRIFT_AUTOLOAD'] which can be used by the autoload * method below. If you have your own autoload system already in place, rename your * __autoload function to something else and then do: * $GLOBALS['AUTOLOAD_HOOKS'][] = 'my_autoload_func'; * * Generate this code using the -phpa Thrift generator flag. */ /** * This parses a given filename for classnames and populates * $GLOBALS['THRIFT_AUTOLOAD'] with key => value pairs * where key is lower-case'd classname and value is full path to containing file. * * @param String $filename Full path to the filename to parse */ function scrapeClasses($filename) { $fh = fopen($filename, "r"); while ($line = fgets($fh)) { $matches = array(); if ( preg_match("/^\s*class\s+([^\s]+)/", $line, $matches)) { if (count($matches) > 1) $GLOBALS['THRIFT_AUTOLOAD'][strtolower($matches[1])] = $filename; } } } function findFiles($dir, $pattern, &$finds) { if (! is_dir($dir)) return; if (empty($pattern)) $pattern = "/^[^\.][^\.]?$/"; $files = scandir($dir); if (!empty($files)) { foreach ($files as $f) { if ($f == "." || $f == "..") continue; if ( is_file($dir . DIRECTORY_SEPARATOR . $f) && preg_match($pattern, $f)) { $finds[] = $dir . DIRECTORY_SEPARATOR . $f; } else if ( is_dir($dir . DIRECTORY_SEPARATOR . $f) && substr($f, 0, 1) != ".") { findFiles($dir . DIRECTORY_SEPARATOR . $f, $pattern, $finds); } } } } function str_var_dump($object) { ob_start(); var_dump($object); $dump = ob_get_clean(); return $dump; } // require Thrift core require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . "Thrift.php"); if (! isset($GLOBALS['THRIFT_ROOT'])) $GLOBALS['THRIFT_ROOT'] = dirname(__FILE__); log_message('debug','bootstrap autoload.php is executing'); // stuff for managing autoloading of classes $GLOBALS['THRIFT_AUTOLOAD'] = array(); $GLOBALS['AUTOLOAD_HOOKS'] = array(); $THRIFT_AUTOLOAD =& $GLOBALS['THRIFT_AUTOLOAD']; // only populate if not done so already if (empty($GLOBALS['THRIFT_AUTOLOAD'])) { //$allLibs = glob( dirname(__FILE__) . "/**/*.php"); // oh poor winblows users can't use glob recursively $allLibs = array(); findFiles( dirname(__FILE__), "/\.php$/i", $allLibs); log_message('debug',str_var_dump($allLibs)); if (!empty($allLibs)) { foreach ($allLibs as $libFile) { scrapeClasses($libFile); } log_message('debug','all scrapped classes: ' . str_var_dump($GLOBALS['THRIFT_AUTOLOAD'])); } }else{ log_message('debug','$GLOBALS[THRIFT_AUTOLOAD] already defined'); } // main autoloading if (!function_exists('__autoload')) { function __autoload($class) { log_message('debug','__autoload'); global $THRIFT_AUTOLOAD; $classl = strtolower($class); if (isset($THRIFT_AUTOLOAD[$classl])) { // log_message('debug','$THRIFT_AUTOLOAD[$classl] is set, do require_once'); //include_once $GLOBALS['THRIFT_ROOT'].'/packages/'.$THRIFT_AUTOLOAD[$classl]; require_once($THRIFT_AUTOLOAD[$classl]); } else if (!empty($GLOBALS['AUTOLOAD_HOOKS'])) { log_message('debug','$GLOBALS[AUTOLOAD_HOOKS]is no empty, lets foreach'); foreach ($GLOBALS['AUTOLOAD_HOOKS'] as $hook) { // log_message('debug','iterate'); $hook($class); } } else { log_message('debug','nothing to do'); } } } log_message('debug',str_var_dump($allLibs));以及输出:http://pastebin.com/8w1MCKx9

正如您所看到的,UserStore类似乎与THttpClient或TBinaryProtocol一样精确加载...对此问题的任何想法?

我不知道是否重要,但我注意到在autoload.php上定义的log_message('debug','all scrapped classes: ' . str_var_dump($GLOBALS['THRIFT_AUTOLOAD']));无法从CI控制器访问。可能我错过了关于CI架构的一些内容。

1 个答案:

答案 0 :(得分:0)

从我们最新的SDK更新开始,UserStoreClient(以及其他SDK类)位于适当的名称空间中。假设您正在使用我们生成的代码,您是否导入了正在使用的类? E.g。

use EDAM\UserStore\UserStoreClient;