学习面向对象的PHP方面

时间:2017-12-30 03:19:56

标签: php oop

正如标题所说,我开始学习PHP的面向对象方面。在这方面,我做了一些小的“练习”,将我的一个php函数“翻译”成了oo模式的php。我问你的善良的人有没有关于我的困境可以给我的建议。

非oo PHP示例:

    <?php
    function pristup($servername, $username, $password, $dbname, $sql){

        $conn=new mysqli($servername, $username, $password, $dbname);

        if($conn->connect_error){

            die("Neuspela konekcija: ".$conn->connect_error);

        }

        $result = $conn->query($sql);
        if ($result == TRUE) {
        //echo "Uspela konekcija";
    } else {
        echo "Neuspešno izvršavanje upita: " . $conn->error;
    }
        return $result;

        $conn->close();

    }

    ?>

以面向对象的方式完成的示例:

<?php

class konekcija{

    private $servername;
    private $username;
    private $password;
    private $dbname;
    private $sql;

    //Setter functions
    public function setServername($par){

        $this->servername = $par; 

    }

    public function setUsername($par){ 

        $this->username = $par; 

    }

    public function setPassword($par){ 

        $this->password = $par; 

    }

    public function setDBname($par){ 

        $this->dbname = $par; 

    }

    public function setSQL($par){ 

        $this->sql = $par; 

    }

    //Getter functions
    public function getServername() { 
        return $this->servername;
    }

    public function getUsername() { 
        return $this->username;
    }

    public function getPassword() { 
        return $this->password;
    }

    public function getDBname() { 
        return $this->dbname;
    }

    public function getSQL() { 
        return $this->sql;
    }

    //Function that executes query.
    public function pristup($server_name, $user_name, $pass_word, $db_name, $sql_query){

        $conn=new mysqli($server_name, $user_name, $pass_word, $db_name);

        if($conn->connect_error){

            die("Neuspela konekcija: ".$conn->connect_error);

        }

        $result = $conn->query($sql_query);

        if ($result == TRUE){

        echo "Uspela konekcija";

        } 
        else{

                echo "Neuspešno izvršavanje upita: " . $conn->error;

            }

        return $this->$result;

        $conn->close();

    }

}


$kon = new konekcija(); //Creation of an object.

//Setting values.
$kon -> setServername("localhost"); 
$kon -> setUsername("root");
$kon -> setPassword("");
$kon -> setDBname("test"); 

$kon -> setSQL("CREATE TABLE example(
                id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
                firstname VARCHAR(30) NOT NULL,
                lastname VARCHAR(30) NOT NULL,
                email VARCHAR(50),
                reg_date TIMESTAMP
                )"
            );

//Getting values and inserting them into class method.
$kon -> pristup($kon->getServername(), $kon->getUsername(), $kon->getPassword(), $kon->getDBname(), $kon->getSQL());

?>

这有效。我问的是代码有什么好处?有没有更好/更成熟的方式这样做?任何建议将被认真考虑。 PS:我得到了“注意:未定义的属性:konekcija ::第1行的C:\ xampp \ htdocs \ www \ klase \ tab_klass.php”为什么会发生这种情况?

1 个答案:

答案 0 :(得分:2)

只是简单的例子:

<?php

// class konekcija{ - ONLY ENGLISH!
class SimpleDB{
    private $conn;

    //Setter functions - NOOO!
    //Getter functions - NOOO!

    // hide all data inside class instance
    public function __construct($server_name, $user_name, $password, $db_name){
        $this->conn=new mysqli($server_name, $user_name, $password, $db_name);

        if($this->conn->connect_error){
            die("ERROR: " . $this->conn->connect_error);
        }
    }

    function __destruct() {
        $this->conn->close();
    }

    //Function that executes query.
    // public function pristup( - ONLY ENGLISH!
    public function execute($sql_query){
        $result = $this->conn->query($sql_query);
        if ($result == TRUE){
            echo "Uspela konekcija";
        } else {
            echo "Neuspešno izvršavanje upita: " . $conn->error;
        }

        return $result;
    }
}


$kon = new SimpleDB("localhost", "root", "", "test"); 

$SQL = "CREATE TABLE example(
        id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
        firstname VARCHAR(30) NOT NULL,
        lastname VARCHAR(30) NOT NULL,
        email VARCHAR(50),
        reg_date TIMESTAMP
        )";
$kon->execute($SQL);
?>

- 为什么只有英文?

首先,因为99%的 开发人员知道/使用英语,尽管它们并不是母语。如果在代码中仅使用英语单词,那么理解代码会更容易,因此99%的 优秀的 开发人员将帮助您完成代码。中学,它是关于一致性的:while($running) doJob();while($zapushen) rabotat()(俄语学生风格,是的)更容易阅读。

- 为什么要删除getter / setter?

使用getter / setter是一种非常常见的做法,但它会破坏OOP的全部含义。使用它们,我们就像把它们翻出来一样。该对象本身必须能够执行必要的操作,但我们好像说&#34;不!向我们提供数据,我们更了解如何与他们合作!&#34;。

有时候getter / setter是一个必要的邪恶,所以不要过度编码,但从长远来看,它们只会造成伤害。我不会强烈要求你完全放弃getter / setter,但最好再考虑一下你可以替换它们的行为。

  

此外,我将帖子移至codereview.stackexchange.com/questions/183916 / ...一位用户建议在codereview上使用范例MVC。经过简短的阅读后,与这个例子相比,这个特定的例子有什么好处,你会怎么做&#34;翻译&#34;你的MVC范例的例子?

首先,MVC不是范例,它是一种模式。而这种模式主要是针对用户界面的某种形式。至少,尝试将其用于数据库并不是一个很好的解决方案。在我看来,这个人对MVC感到兴奋并将其用于其他目的。

我个人不喜欢在这里尝试应用MVC。而且,我根本不喜欢这种模式。也许我和他一起工作了一点,也许我没有看到任何好的例子,但我不喜欢它。我特别喜欢像use \ MyApp \ Database \ Model as Connection;这样的代码。如果它是连接,那么为什么称它为模型?只是为了命名这个MVC?在这个例子中,对我来说存在许多有争议的问题。

总的来说,我会说从长远来看,任何范式,模式等的正确应用都会带来好处。我们应用它们越复杂,项目应该越大,所以它们的所有好处都将被揭示出来。对数据库的一个查询不是一个好项目,即使对于OOP,更不用说不同的模式了。

是否有申请/学习MVC的愿望? - 做更复杂的项目,例如,某种组织者。

关于日志记录和错误的一小部分补充。

我会抛出异常。但是伐木怎么样?好吧,我会做这样的事情:

interface IQuery{
    public function execute($sql);
}

class SimpleDB implements IQuery{
    ......

    public function execute($sql_query){
        $result = $this->conn->query($sql_query);
        if($result === FALSE){
            throw new EMyCustomException($conn->error);
        }

        return $result;
    }
}

class LoggedDB implements IQuery{
    private $db;

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

    public function execute($sql_query){
        try{
            return $this->db->execute($sql_query);
        } catch (EMyCustomException $e) {
            // perform logging
            throw $e; // rethrow
        }
    }
}

$db = new LoggedDB(new SimpleDB(......));
$db->execute("not a valid sql here");

至于我,这是一个更好的方法,特别是对于初学者。