【问题标题】:The usage of classes and OOP in PhPPhP中类和OOP的使用
【发布时间】:2017-10-28 11:01:00
【问题描述】:

我在 php 中遇到了一些 OOP 问题,因为这是我第一次使用它。我正在尝试在没有框架的情况下编写自己的身份验证系统,只是为了了解注册/登录/注销系统的基础知识。所以到目前为止我已经做了这个,文件connect.php:

<?php

class Dbconnect {
    private $servername;
    private $username;
    private $password;
    private $dbname;

    protected function connect() {
        $this->servername = "localhost";
        $this->username = "root";
        $this->password = "root";
        $this->dbname = "example";

        $conn = new mysqli($this->servername,$this->username,$this->password,$this->dbname);
        return $conn;
    }
}

看起来不错,对吧?但是现在我不明白我的 register.php 文件应该是什么样子,我写了一个程序版本,不知道如何修改它成为 OOP 这里是:

<?php


include 'connect.php';

$Err = $emailErr = $usernameErr =  "";

//registration
if(isset($_POST['register'])) {
    $username = mysqli_real_escape_string($conn,$_POST['username']);
    $email = mysqli_real_escape_string($conn,$_POST['email']);
    $password = mysqli_real_escape_string($conn,$_POST['password']);

    if(empty($username) || empty($email) || empty($password)) {
        $Err = "Empty field(s)";
    } 

    if(!preg_match("/^[a-zA-z ]+$/", $username)){
        $usernameErr = "Use letters for user";
    } elseif(!filter_var($email, FILTER_VALIDATE_EMAIL)) {
        $emailErr = "Wrong email format";

            }

        }

           if ($Err == "" && $emailErr == "" && $usernameErr == "") {
    $hashed_password = password_hash($password, PASSWORD_DEFAULT);
    $sql = "INSERT INTO users (username, email, password)
    VALUES('$username','$email','$hashed_password')";
    $result = $conn->query($sql);
    if($result) {
        header('location: http://' . $_SERVER['HTTP_HOST'] . '/test/success.php');
        exit();   

    } else {
        echo "Error: " . $sql . "<br>" . $conn->error;
    }


}

    }
?>

谁能解释我应该如何修改这个文件。谢谢。

【问题讨论】:

  • 尝试学习 php 中的面向对象编程教程。这将有助于建立正确的学习基础。
  • 您的 mysqli 连接无法建立。使用 mysqli 连接函数作为“__construct”方法。
  • @NandhiKumar,我为什么要这样做? localhost 参数是私有的,永远不会改变,为什么要使用构造?
  • 什么时候调用connect方法?
  • 从遵循良好的结构化过程编程原则开始。然后,寻找具有相同参数或全局变量的函数。这些是抽象成类的候选对象,共享变量成为对象的状态,函数成为方法。

标签: php mysql oop


【解决方案1】:

对于其他人来说我会有所不同,但我是这样处理的:自上而下构建它

因此,您首先为代码任务编写高级逻辑,您希望您的代码实现:

$connection = new MySQLi('localhost', 'root', 'password', 'example');
$authenticator = new Authenticator($connection);

$activity = $_POST['action'] ?? 'default';
if ('register' === $activity) {
    $user = $authenticator->register($_POST['name'], $_POST['pass']);
}
if ('login' === $activity) {
    if ($authenticator->login($_POST['name'], $_POST['pass'])) {
        echo 'On';
    }
}

当定义了顶层方法时,你会更深入,并会出现下一层(它可以是一个或多个类)。

class Authenticator 
{
    private $connection;

    public function __construct($connection) {
         $this->connection = $connection;
    }

    public function register($username, $password) {
        $user = new User($username);
        $user->setPassword($password);
        $user->save($this->connection);
        return $user;
    }

    public function login($username, $password) {
        $user = new User($username);
        $user->load($this->connection);
        return $user->isMatchingPassword($password)
    }
}

此时您可以开始查看您需要填写的代码的其他部分。在这种情况下,从本示例的代码中,您还需要至少使用已经提到的方法来实现 User 类。

在每个步骤中,您都解决了一个特定范围的问题,这样,即使在处理非常复杂的项目时,您也不会不知所措。

一些相关说明

  • 你不能在构造函数中return
  • 实际上为 DB 连接做一个包装是没有意义的。相反,您应该使用 PHP 附带的 MySQLi 或 PDO 类。
  • 您的代码容易受到 SQL 注入的攻击。观看this video,了解如何避免此类漏洞。
  • 要查找更多学习资料,建议观看this list的讲座。

【讨论】:

  • 注意:$activity = $_POST['action'] ?? 'default'; 三元法只适用于php 7+
猜你喜欢
  • 1970-01-01
  • 2023-03-21
  • 1970-01-01
  • 2015-10-23
  • 2013-08-05
  • 2020-09-26
  • 2012-07-15
  • 1970-01-01
  • 2011-06-04
相关资源
最近更新 更多