Php 组合项目中实例化类的问题
因此,我的任务是访问外部api,然后将结果呈现给单独的FE。我制作了一个ApiClass和一个ProductListClass。然后从一个索引页,我包含了两个类文件,然后试图调用ProductListClass方法,但是我得到了一个ApiClass not found错误,并且不能完全找出原因,非常感谢任何帮助 这是我的眼镜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
<?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();
}