php - property_exists 方法没有命中
问题描述
所以我想出了这个代码:
public function duplicateSelectedAd($request)
{
$setData = [];
$newAd = $request[0];
foreach($newAd as $key=>$value) {
if(property_exists(AdFields::class, strtoupper($key))){
$setData[AdFields::strtoupper($key)] = array_get($request[0], $value);
}
}
$ad = new Ad(null, 'act_'.$newAd['account_id']);
$ad->setData($setData)->create();
}
它检查返回数组的所有索引,并应该将它们复制到新广告中。这都是通过 facebook API 实现的。这是添加字段类:
class AdFields extends AbstractEnum {
const ACCOUNT_ID = 'account_id';
const AD_REVIEW_FEEDBACK = 'ad_review_feedback';
const ADLABELS = 'adlabels';
const ADSET = 'adset';
const ADSET_ID = 'adset_id';
const BID_AMOUNT = 'bid_amount';
const BID_INFO = 'bid_info';
const BID_TYPE = 'bid_type';
const CAMPAIGN = 'campaign';
const CAMPAIGN_ID = 'campaign_id';
const CONFIGURED_STATUS = 'configured_status';
const CONVERSION_SPECS = 'conversion_specs';
const CREATED_TIME = 'created_time';
const CREATIVE = 'creative';
const EFFECTIVE_STATUS = 'effective_status';
const ID = 'id';
const LAST_UPDATED_BY_APP_ID = 'last_updated_by_app_id';
const NAME = 'name';
const RECOMMENDATIONS = 'recommendations';
const SOURCE_AD = 'source_ad';
const SOURCE_AD_ID = 'source_ad_id';
const STATUS = 'status';
const TRACKING_SPECS = 'tracking_specs';
const UPDATED_TIME = 'updated_time';
const ADSET_SPEC = 'adset_spec';
const DATE_FORMAT = 'date_format';
const DISPLAY_SEQUENCE = 'display_sequence';
const EXECUTION_OPTIONS = 'execution_options';
const FILENAME = 'filename';
public function getFieldTypes() {
return array(
'account_id' => 'string',
'ad_review_feedback' => 'AdgroupReviewFeedback',
'adlabels' => 'list<AdLabel>',
'adset' => 'AdSet',
'adset_id' => 'string',
'bid_amount' => 'int',
'bid_info' => 'map<string, unsigned int>',
'bid_type' => 'BidType',
'campaign' => 'Campaign',
'campaign_id' => 'string',
'configured_status' => 'ConfiguredStatus',
'conversion_specs' => 'list<ConversionActionQuery>',
'created_time' => 'datetime',
'creative' => 'AdCreative',
'effective_status' => 'EffectiveStatus',
'id' => 'string',
'last_updated_by_app_id' => 'string',
'name' => 'string',
'recommendations' => 'list<AdRecommendation>',
'source_ad' => 'Ad',
'source_ad_id' => 'string',
'status' => 'Status',
'tracking_specs' => 'list<ConversionActionQuery>',
'updated_time' => 'datetime',
'adset_spec' => 'AdSet',
'date_format' => 'string',
'display_sequence' => 'unsigned int',
'execution_options' => 'list<ExecutionOptions>',
'filename' => 'file',
);
}
}
如果我在循环之前返回 $newAd,我会得到所有带有值或 null 的 adfields 选项,所以我知道我正在把它带进来,对。我只是不知道为什么它没有达到 if 语句。任何意见,将不胜感激。
解决方案
看起来有点脏,但是您可以将类和常量名称连接为定义的参数来检查它是否存在:
$constant = AdFields::class . '::' . strtoupper($key);
defined($constant);
AdFields::strtoupper($key)
不会像你期望的那样工作。这将尝试在 AdFields 类上调用名为 strtoupper 的静态方法。检索动态常量时,您需要使用具有相同连接字符串的常量方法:
constant($constant)
推荐阅读
- javascript - 将对象 ID 添加到对象 ID 数组中
- python-3.x - 可以将我的临时文件放入我的应用程序的 tmp/ 目录中吗?
- javascript - 成功事件后如何重新加载数据表?
- c# - 如何将值从用户控件传递到另一个用户控件
- javascript - 尽管正确链接了 HTML,但未定义的错误
- css - 角度无法识别styles.scss,因此角度通知器不起作用
- c++ - 为什么 C++ 单例需要 memory_order_acquire
- react-native - 将原生视频与 expo 结合使用
- html - 如何使用 el-table (Element UI?
- reactjs - 如何在反应和打字稿中使用上下文解决属性 isDialogOpen 和 setIsDialogOpen 不存在?