我正在研究一种使用Requests
库的lib。我在标题中得到错误。我正在做以下事情:
function __autoload($class_name) {
include 'vendor/rmccue/requests/library/Requests.php';
$class_file = $class_name.'.php';
print $class_file;
if(file_exists($class_file)) {
include $class_file;
} else {
throw new Exception("Unable to load $class_name.<br>.<br>.<br>");
}
}
$session = new Session($instanceID,$profileID,$routerID,$api_endpoint,$headers);
$session->createSession();
由于Requests
将在多个类中使用,我想加载一次。我该怎么办?
session.php文件
class Session
{
private $instanceID = null;
private $profileID = null;
private $routerID = null;
private $apiEndpoint = null;
private $headers = null;
public function __construct($instance_id,$profile_id,$router_id,$api_endpoint,$headers)
{
$this->instanceID = $instance_id;
$this->profileID = $profile_id;
$this->routerID = $router_id;
$this->apiEndpoint = $api_endpoint;
$this->headers = $headers;
}
public function createSession()
{
$create_session_url = $this->apiEndpoint.'createSession?{"accountID":"39BB2F17-89D6-2093-B133-76C21D513EDF"}';
$create_session_url = 'https://api.xx.cc/api/index.php/smartcall/createSession?{%22accountID%22:%2239BB2F17-89D6-2093-B133-76C21D513EDF%22}';
$request = \Requests::get($create_session_url, $this->headers);
var_dump($request->body);
}
}
更新#1 通过这样做我现在说:未找到类会话:
include 'vendor/rmccue/requests/library/Requests.php';
\Requests::register_autoloader();
function __autoload($class_name) {
$class_file = $class_name.'.php';
if ($class_file != 'Requests.php') {
print $class_file;
if(file_exists($class_file)) {
include_once $class_file;
} else {
throw new Exception("Unable to load $class_name.<br>.<br>.<br>");
}
}
}
$session = new Session($instanceID,$profileID,$routerID,$api_endpoint,$headers);
$session->createSession();
答案 0 :(得分:1)
使用include_once
代替include
。
include_once
可用于在脚本的特定执行期间可能包含和评估多个相同文件的情况,因此在这种情况下,它可以帮助避免诸如函数重定义,变量值重新分配之类的问题等等。
请参阅此处的文档:include_once()
答案 1 :(得分:0)
每次自动包含课程时,您都会尝试包含您的资料库:
function __autoload($class_name) {
include 'vendor/rmccue/requests/library/Requests.php';
使用include_once
可能会解决这个问题,但实际上自动加载器应该配置为在需要时自动加载Request
。
所以你真的不应该在自动加载函数中包含库,让你的自动加载函数处理所有类。
答案 2 :(得分:0)
好的,spl_autoload_register
就是答案。问题出现了,因为我的代码有__autolod
和spl_autoload_register
(在库中)。
来自manual:
如果你的代码有一个现有的__autoload()函数,那么这个函数 必须在__autoload队列上显式注册。这是因为 spl_autoload_register()将有效地替换引擎缓存 __autoload()函数由spl_autoload()或 spl_autoload_call()。
我在 call.php :
中做了以下更改include_once 'vendor/rmccue/requests/library/Requests.php';
\Requests::register_autoloader();
并将__autoload()
更改为简单的函数名称,例如:autoload
并在spl_autoload_register()
中调用它。代码如下:
function autoload($class_name) {
$class_file = $class_name.'.php';
if ($class_file != 'Requests.php')
{
if(file_exists($class_file)) {
include_once $class_file;
} else {
throw new Exception("Unable to load $class_name.<br>.<br>.<br>");
}
}
}
spl_autoload_register('autoload');
由于所有课程都通过spl_autoload_register
排队,因此没有冲突。我可以只调用Request
一次,然后可以使用我自己的类。