Php 组合项目中实例化类的问题

Php 组合项目中实例化类的问题,php,oop,guzzle,composition,Php,Oop,Guzzle,Composition,因此,我的任务是访问外部api,然后将结果呈现给单独的FE。我制作了一个ApiClass和一个ProductListClass。然后从一个索引页,我包含了两个类文件,然后试图调用ProductListClass方法,但是我得到了一个ApiClass not found错误,并且不能完全找出原因,非常感谢任何帮助 这是我的眼镜 <?php namespace app\ApiClass; use GuzzleHttp\Client; class ApiClass { prot

因此,我的任务是访问外部api,然后将结果呈现给单独的FE。我制作了一个ApiClass和一个ProductListClass。然后从一个索引页,我包含了两个类文件,然后试图调用ProductListClass方法,但是我得到了一个ApiClass not found错误,并且不能完全找出原因,非常感谢任何帮助

这是我的眼镜

   <?php

namespace app\ApiClass;
use GuzzleHttp\Client;

class ApiClass
{
    protected $url;
    protected $client;

    public function __construct(Client $client)
    {
        $this->url = 'http://external-api';
        $this->client = new $client; //GuzzleHttp\Client
    }

    private function getResponse(string $uri = null)
    {
        $full_path = $this->url;
        $full_path .=$uri;
       $result = $this->client->get($full_path);
        return json_decode($result->getBody()->getContents(), true);
    }
    public function getData($uri)
    {
        return $this->getResponse($uri);
    }
}

您需要从正确的名称空间实例化ApiClass,您的
ApiClass
的完全限定名(FQN)是
app\ApiClass\ApiClass
。你要么打电话

$api = app\ApiClass\ApiClass();
或者通过在文件头中导入命名空间仅使用类名:

use app\ApiClass\ApiClass;

include_once 'app/ProductListClass.php';
include_once 'app/ApiClass.php';

$api = new ApiClass();
...
为每个文件声明名称空间,因此您不能通过在不同上下文中包含文件来更改它们。文件中未定义名称空间意味着它是全局名称空间(如
ProductListClass

GuzzleHttp\客户端 如果要将
Client
实例传递给ApiClass,则需要将其实例化,无需再次对其使用
new
。如果您将FQN字符串作为参数,您可以这样做,但这不是一个好的实践(除非您在某些依赖项注入库中执行这种神奇的操作)

因此,要么这样做(首选):

使用api实例化:

$api = new ApiClient(new GuzzleHttp\Client());
或在构造函数内部实例化,不带参数:

    public function __construct()
    {
        $this->url = 'http://external-api';
        $this->client = new GuzzleHttp\Client();
    }

另外,我认为你应该学会使用和自动加载它(自动包含类文件)-使用库(和你自己的类)会容易得多。

@BarryWatts我已经扩展了我的答案-我想你应该对这个问题做同样的事。使用@shubder-answer我成功地实现了这一点
class ApiClass
{
    ...
    public function __construct(Client $client)
    {
        $this->url = 'http://external-api';
        $this->client = $client;
    }
$api = new ApiClient(new GuzzleHttp\Client());
    public function __construct()
    {
        $this->url = 'http://external-api';
        $this->client = new GuzzleHttp\Client();
    }