PHP7面向对象:替换硬编码数组,动态存入获取的数组
动态替换类中的硬编码服务数组(基于EasyPost API)
嘿,我来帮你搞定这个问题!要把类里硬编码的$services数组替换成从EasyPost API获取的动态数据,你可以按照以下步骤来实现:
1. 修改类属性初始化
首先把原来硬编码的数组改成空数组初始化,后续通过方法动态赋值:
public $services = [];
2. 完善EasyPost数据获取方法
补全easypost_database方法,调用EasyPost API获取快递服务列表,并处理成你需要的键值对格式。同时要加上错误处理,避免API调用失败导致功能异常:
public function easypost_database() { // 设置你的EasyPost API密钥 \EasyPost\EasyPost::setApiKey('your_easypost_api_key'); try { $services = []; // 获取Canada Post的服务列表并格式化 $canadaPost = \EasyPost\CarrierType::retrieve('CanadaPost'); foreach ($canadaPost->services as $service) { // 这里可以根据需求调整键和值的格式,比如用服务code作为键 $services[$service->code] = "Canada Post - {$service->name}"; } // 获取Purolator的服务列表并格式化 $purolator = \EasyPost\CarrierType::retrieve('Purolator'); foreach ($purolator->services as $service) { $services[$service->code] = "Purolator {$service->name}"; } // 如果需要和原来的数字键(01、02)对应,可添加映射逻辑 // 示例:生成两位数字的键 // $mappedServices = []; // $index = 1; // foreach ($services as $name) { // $key = str_pad($index, 2, '0', STR_PAD_LEFT); // $mappedServices[$key] = $name; // $index++; // } // return $mappedServices; return $services; } catch (\EasyPost\Error $e) { // API调用失败时,回退到原来的硬编码数组,保证服务可用 error_log("EasyPost API调用错误: {$e->getMessage()}"); return [ '01' => 'Canada Post - Priority', '02' => 'Canada Post - Regular Parcel', '03' => 'Canada Post - Xpresspost', '04' => 'Purolator Express 9AM', '05' => 'Purolator Express 1030AM', '06' => 'Purolator Express', '07' => 'Purolator Ground', ]; } }
3. 在类初始化时加载数据
在类的构造函数中调用easypost_database方法,把动态获取的数组赋值给$services,这样类实例化后就能直接使用这个属性:
public function __construct() { $this->services = $this->easypost_database(); }
完整类示例
把以上部分整合起来,完整的类代码如下:
class ShippingService { public $services = []; public function __construct() { $this->services = $this->easypost_database(); } public function easypost_database() { \EasyPost\EasyPost::setApiKey('your_easypost_api_key'); try { $services = []; // 获取Canada Post服务 $canadaPost = \EasyPost\CarrierType::retrieve('CanadaPost'); foreach ($canadaPost->services as $service) { $services[$service->code] = "Canada Post - {$service->name}"; } // 获取Purolator服务 $purolator = \EasyPost\CarrierType::retrieve('Purolator'); foreach ($purolator->services as $service) { $services[$service->code] = "Purolator {$service->name}"; } return $services; } catch (\EasyPost\Error $e) { error_log("EasyPost API Error: {$e->getMessage()}"); // 回退到硬编码数组 return [ '01' => 'Canada Post - Priority', '02' => 'Canada Post - Regular Parcel', '03' => 'Canada Post - Xpresspost', '04' => 'Purolator Express 9AM', '05' => 'Purolator Express 1030AM', '06' => 'Purolator Express', '07' => 'Purolator Ground', ]; } } }
关键提示
- 记得替换
your_easypost_api_key为你实际的EasyPost API密钥 - 如果EasyPost返回的服务code和你原来的数字键(01、02等)不匹配,可以使用注释里的映射逻辑调整格式
- 添加错误回退机制很重要,能避免API故障导致你的功能完全不可用
内容的提问来源于stack exchange,提问作者user6818018
相关产品推荐
相关产品推荐

