无法重新声明课程要求

时间:2016-03-24 08:00:40

标签: php autoload

我正在研究一种使用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();

3 个答案:

答案 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就是答案。问题出现了,因为我的代码有__autolodspl_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一次,然后可以使用我自己的类。