PHP 7.3 调用 Claude 需通过 HTTP 客户端(如 cURL)发送符合 Anthropic API 规范的 HTTPS 请求,核心步骤包括:1. 用 strtr 安全填充提示词模板;2. 构造含 model、messages 等字段的 JSON 请求体;3. 设置 x-api-key、anthropic-version 等请求头并发送 POST;4. 封装为兼容 PHP 7.3 的 ClaudeClient 类以复用。

<p>PHP 7.3 本身不能直接调用 Claude,因为 Anthropic 官方不提供 PHP SDK,且 Claude API(通过 <strong>Anthropic API</strong>)仅支持 HTTPS 请求(需 API Key + 正确的请求头与 JSON 格式),必须通过 HTTP 客户端(如 cURL 或 Guzzle)调用。封装提示词模板的核心是:把业务逻辑中的变量安全注入到预设的提示结构中,同时避免字符串拼接引发的格式/转义问题。</p>
<H3>1. 使用 sprintf 或 strtr 安全填充提示词模板</H3>
<p>避免直接用 . 连接变量(易出错、难维护)。推荐用命名占位符 + <strong>strtr</strong>,语义清晰且防注入:</p>
<font color="#666">
<pre>
$template = "你是一名技术文档助手。请基于以下内容生成简洁的中文摘要:
内容:"{content}"
要求:不超过 100 字,不使用 markdown,不添加额外说明。";
$data = [
'content' => "PHP 7.3 已停止官方支持,建议升级至 8.0+。注意 mbstring 和 openssl 扩展兼容性变化。"
];
$prompt = strtr($template, $data);
</pre>
</font>
<H3>2. 构建符合 Anthropic API 要求的请求体</H3>
<p>Claude 的 <strong>/v1/messages</strong> 接口要求 messages 数组格式(role: "user" / "assistant"),且必须指定 model 和 max_tokens。PHP 7.3 需手动构造 JSON:</p>
<font color="#666">
<pre>
$anthropic_key = 'sk-ant-api03-...'; // 替换为你的密钥
$payload = [
'model' => 'claude-3-haiku-20240307',
'max_tokens' => 256,
'messages' => [
['role' => 'user', 'content' => $prompt]
]
];
// 注意:JSON_UNESCAPED_UNICODE 是必须的,否则中文变 \uXXXX
$json_body = json_encode($payload, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
</pre>
</font>
<H3>3. 用 cURL 发起带认证的 POST 请求</H3>
<p>PHP 7.3 原生 cURL 完全够用。关键点:设置 <strong>anthropic-version</strong> 头、Bearer 认证、Content-Type,并检查 HTTP 状态码:</p>
<font color="#666">
<pre>
$ch = curl_init('https://api.anthropic.com/v1/messages');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $json_body,
CURLOPT_HTTPHEADER => [
'x-api-key: ' . $anthropic_key,
'anthropic-version: 2023-06-01',
'Content-Type: application/json',
'Accept: application/json'
],
CURLOPT_TIMEOUT => 30
]);
$response = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($http_code === 200) {
$result = json_decode($response, true);
echo $result['content'][0]['text'] ?? '无返回内容';
} else {
error_log("Claude API error: {$http_code} - {$response}");
}
</pre>
</font>
<H3>4. 封装成可复用的类(适配 PHP 7.3)</H3>
<p>把模板填充、请求组装、错误处理收拢到一个轻量类里,便于多处调用:</p>
<font color="#666">
<pre>
class ClaudeClient
{
private $apiKey;
private $baseUrl = 'https://api.anthropic.com/v1/messages';
public function __construct($apiKey) {
$this->apiKey = $apiKey;
}
public function send($template, array $data, $model = 'claude-3-haiku-20240307') {
$prompt = strtr($template, $data);
$payload = [
'model' => $model,
'max_tokens' => 256,
'messages' => [['role' => 'user', 'content' => $prompt]]
];
$ch = curl_init($this->baseUrl);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => json_encode($payload, JSON_UNESCAPED_UNICODE),
CURLOPT_HTTPHEADER => [
'x-api-key: ' . $this->apiKey,
'anthropic-version: 2023-06-01',
'Content-Type: application/json'
]
]);
$response = curl_exec($ch);
curl_close($ch);
return $response ? json_decode($response, true) : null;
}
}
// 使用示例
$client = new ClaudeClient('sk-ant-api03-...');
$result = $client->send(
'将下面的代码片段转换为 PHP 7.3 兼容写法:{code}',
['code' => 'array_key_first($arr);']
);
echo $result['content'][0]['text'] ?? '';
</pre>
</font>