PHP:在类中加载一个类

时间:2014-09-30 00:04:26

标签: php class oop subclass

我有一个类“加载”另一个类,但是我无法让它工作。

错误消息

Fatal error: Call to undefined method stdClass::echoString() in C:\Program Files (x86)\EasyPHP-DevServer-14.1VC11\data\localweb\classes\example.php on line 5

代码

我的代码分为三个主要部分:

  • api.php - 加载其他类的类。
  • API/exampleExternalAPI.php - (多个文件)api.php加载的类

  • example.php - 使用主类的文件(api.php

如果有帮助可以从我的dropbox

下载这些文件

api.php

<?php
/* Config */
define('pathToAPIs','API/');

/* Autoload Function */
spl_autoload_register(function($className){
    $namespace=str_replace("\\","/",__NAMESPACE__);
    $className=str_replace("\\","/",$className);
    $class=pathToAPIs.(empty($namespace)?"":$namespace."/")."{$className}.php";
    include_once($class);
});

class api {
    private $listOfAPIs;

    public $APIs;

    public function __construct($setAPI = null){
        $this->updateListOfAPIs();
        if (isset($setAPI)){
            return $this->setAPI($setAPI);
        }
    }
    public function setAPIs($setAPIs){
        $this->APIs = null; // clears a previous call to this method
        if (!is_array($setAPIs)){ // if not an array
            $setAPIs = array($setAPIs); // make array
        }
        foreach ($setAPIs as $setAPIType){
            if(in_array($setAPIType,$this->listOfAPIs)){
                $array[$setAPIType] = new $setAPIType;
            }
        }
        $this->APIs = json_decode(json_encode($array), FALSE); // convert array of required api objects to an object
        return $this->APIs;
    }
    public function getListOfAPIs($update = false){
        if ($update){
            $this->updateListOfAPIs();
        }
        return  $this->listOfAPIs;
    }
    private function updateListOfAPIs(){
        $this->listOfAPIs = null; // clears a previous call to this method
        $it = new FilesystemIterator(pathToAPIs);
        foreach ($it as $fileinfo){
            $filename = pathinfo($fileinfo->getFilename(), PATHINFO_FILENAME); // removes extension
            $this->listOfAPIs[]= $filename;
        }
    }
    public function __call($method,$args){

    }
}

API / exampleExternalAPI.php

<?php

class exampleExternalAPI {

       public function echoString($string){
           echo $string;
       }
}

使用example.php

<?php
require_once 'api.php';
$api = new api();
$api->setAPIs('exampleExternalAPI');
$api->APIs->exampleExternalAPI->echoString('string');

背景资料

(可能会对我的疯狂有所了解)

  • 我正在开发一个项目,我需要连接到许多外部API。
  • 所以我决定创建一个类来管理我与外部API的所有通信(不确定最好的方法 - 面向对象编程的新方法)。

1 个答案:

答案 0 :(得分:1)

我不完全确定您尝试解决的问题,但如果您的APIs是一个简单的stdClass实例,它应该按预期工作:

public function setAPIs($setAPIs)
{
    $this->APIs = new stdClass; // clears a previous call to this method
    if (!is_array($setAPIs)) { // if not an array
        $setAPIs = array($setAPIs); // make array
    }
    foreach ($setAPIs as $setAPIType) {
        if (in_array($setAPIType, $this->listOfAPIs)) {
            $this->APIs->{$setAPIType} = new $setAPIType;
        }
    }
    return $this->APIs;
}