PHP从两个不同的文件重新声明了类

时间:2013-01-18 18:32:08

标签: php google-api adsense google-analytics-api fatal-error

我有以下代码。当我运行它时,我收到错误:

Fatal error: Cannot redeclare class Google_Account in
   /var/www/vhosts/example.com/httpdocs/google-api-php-client  
  /src/contrib/Google_AnalyticsService.php on line 379

这是因为“ Google_AdsenseService.php ”和“ Google_AnalyticsService.php ”文件都有一个名为Google_Account的类。 Google_Account类的成员变量和函数在该文件中是不同的。

我需要同时获取Adsense和Google Analytics数据。所以我需要立即使用这两种服务。我找不到取消声明类的方法。我如何一起使用这两种服务?

include_once APP.'Vendor/google-api-php-client/src/Google_Client.php';
$client1 = new Google_Client();
$client1->setApplicationName('aaa');
$client1->setDeveloperKey('1234');
$client1->setRedirectUri('http://example.com/');

include_once APP.'Vendor/google-api-php-client/src/contrib/Google_AdsenseService.php';
$client1->setClientId('2345');
$client1->setClientSecret('4444');
$service1 = new Google_AdsenseService($client1);
// some code that gets data from "$service1"

$client2 = new Google_Client();
$client2->setApplicationName('aaa');
$client2->setDeveloperKey('1234');
$client2->setRedirectUri('http://example.com/');

include_once APP.'Vendor/google-api-php-client/src/contrib/Google_AnalyticsService.php';
$client2->setClientId('4567');
$client2->setClientSecret('5555');
$service2 = new Google_AnalyticsService($client2);
// some code that gets data from "$service2"

2 个答案:

答案 0 :(得分:1)

您可以在contrib目录中的每个文件的顶部添加不同的命名空间。例如,Google_AdsenseService.php文件在顶部添加namespace Google\AdsenseService;

// Google_AdsenseService.php file
namespace Google\AdsenseService;

只要文件内容仅引用同一文件中的内容,它就会起作用。只有当您访问它时,才能通过命名空间访问。像这样,

$service1 = new Google\AdsenseService\Google_AdsenseService($client1);

答案 1 :(得分:0)

您有两种选择:

  1. 对于PHP 5.3+,您可以在文件的开头添加命名空间。在此之后,您需要修复对已修改类中其他类的引用(Exception将变为:: Exception等)

  2. 您可以在文本编辑器中重命名该类,这可能会更容易。只需在您喜欢的文本编辑器中打开文件,然后使用replace all。将Google_Client更改为其他内容。有一个很好的变化,lib不会使用动态类构造和其他有趣的东西,所以你快速重构的代码将起作用。