在 PHP 类中接收表单提交的数据有多种方法,下面介绍几种常见的实现方式:

1. 通过构造函数接收

class FormHandler {
    private $formData;
    
    public function __construct($postData) {
        $this->formData = $postData;
    }
    
    public function processForm() {
        // 处理表单数据
        $name = $this->formData['name'] ?? '';
        $email = $this->formData['email'] ?? '';
        
        echo "姓名: $name, 邮箱: $email";
    }
}

// 使用方式
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $formHandler = new FormHandler($_POST);
    $formHandler->processForm();
}

2. 通过方法接收

class FormProcessor {
    public function handleSubmission($formData) {
        // 过滤和验证数据
        $name = filter_var($formData['name'] ?? '', FILTER_SANITIZE_STRING);
        $email = filter_var($formData['email'] ?? '', FILTER_SANITIZE_EMAIL);
        
        // 处理数据...
        return [
            'name' => $name,
            'email' => $email
        ];
    }
}

// 使用方式
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $processor = new FormProcessor();
    $result = $processor->handleSubmission($_POST);
    print_r($result);
}

3. 使用专门的 setter 方法

class UserRegistration {
    private $username;
    private $password;
    private $email;
    
    public function setUsername($username) {
        $this->username = trim($username);
    }
    
    public function setPassword($password) {
        $this->password = password_hash($password, PASSWORD_DEFAULT);
    }
    
    public function setEmail($email) {
        if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
            $this->email = $email;
        }
    }
    
    public function register() {
        // 执行注册逻辑
        // ...
        echo "用户 {$this->username} 注册成功!";
    }
}

// 使用方式
if ($_POST) {
    $registration = new UserRegistration();
    $registration->setUsername($_POST['username']);
    $registration->setPassword($_POST['password']);
    $registration->setEmail($_POST['email']);
    $registration->register();
}

4. 使用数组解构接收(PHP 7.1+)

class ContactForm {
    public function submit(array $data) {
        ['name' => $name, 'email' => $email, 'message' => $message] = $data;
        
        // 验证和处理数据
        // ...
        
        echo "感谢 $name 的留言!";
    }
}

// 使用方式
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $contact = new ContactForm();
    $contact->submit($_POST);
}

5. 封装请求类

更高级的做法是创建一个专门的请求类:

class Request {
    private $data;
    
    public function __construct() {
        $this->data = array_merge($_GET, $_POST);
    }
    
    public function get($key, $default = null) {
        return $this->data[$key] ?? $default;
    }
    
    public function all() {
        return $this->data;
    }
}

class FormController {
    public function handle(Request $request) {
        $name = $request->get('name');
        $email = $request->get('email');
        
        // 处理表单...
    }
}

// 使用方式
$request = new Request();
$controller = new FormController();
$controller->handle($request);

安全注意事项

  1. 永远不要信任用户输入:始终验证和过滤输入数据

  2. 使用过滤函数:如 filter_var()htmlspecialchars()

  3. 密码处理:使用 password_hash() 存储密码

  4. 防止 SQL 注入:使用预处理语句(PDO 或 mysqli)

  5. CSRF 防护:使用令牌防止跨站请求伪造

完整示例

class UserForm {
    private $data = [];
    private $errors = [];
    
    public function __construct(array $postData) {
        $this->data = $postData;
        $this->validate();
    }
    
    private function validate() {
        // 验证姓名
        if (empty($this->data['name'])) {
            $this->errors['name'] = '姓名不能为空';
        }
        
        // 验证邮箱
        if (empty($this->data['email']) || !filter_var($this->data['email'], FILTER_VALIDATE_EMAIL)) {
            $this->errors['email'] = '请输入有效的邮箱地址';
        }
    }
    
    public function isValid() {
        return empty($this->errors);
    }
    
    public function getErrors() {
        return $this->errors;
    }
    
    public function getData() {
        return [
            'name' => htmlspecialchars($this->data['name']),
            'email' => filter_var($this->data['email'], FILTER_SANITIZE_EMAIL)
        ];
    }
    
    public function save() {
        if (!$this->isValid()) {
            return false;
        }
        
        $cleanData = $this->getData();
        
        // 这里应该是数据库保存逻辑
        // 例如使用 PDO 预处理语句
        
        return true;
    }
}

// 使用示例
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $form = new UserForm($_POST);
    
    if ($form->isValid()) {
        if ($form->save()) {
            echo "表单提交成功!";
        } else {
            echo "保存数据时出错";
        }
    } else {
        echo "表单验证失败: ";
        print_r($form->getErrors());
    }
}

以上方法都可以在类中接收表单数据,选择哪种方式取决于你的项目结构和需求。对于简单的表单,直接传递 $_POST 到类方法即可;对于复杂的应用,建议创建专门的请求类来处理输入数据。