这个PHP代码是根据OO原则正确编写的吗?

时间:2009-06-20 00:32:02

标签: php sql oop

我一直试图让我的头围绕物体方向,我认为iv开始得到一些概念,但我不确定。如果我的思路正确,那么谷歌搜索可以回答是非常困难所以我决定在这里问一下这个问题,请告诉我这个问题是否违反任何规则。

我是否正确思考过消息传递?什么是明显不好的事情?在学习的过程中,我该怎么想? 像getpagecontent($page, $connection);

我正在阅读 [Oreilly - 学习php和mysql] [1]和 [面向对象环境中的编程] [2] 还有一些关于UML的书籍

这是代码。

dbfunctions.php

<?php
class dbconnect {

    function dbconnect() {
    $this->dbhost = 'xx';
    $this->dbuser = 'xx';
    $this->dbpass = 'xx';
    $this->dbdatabase = 'xx';
    }

    function createdbconnection() {
        require_once('DB.php'); // pear

        $this->connection = DB::connect("mysql://$this->dbuser:$this->dbpass@$this->dbhost/$this->dbdatabase");

        if (DB::isError($this->connection)) {
        die("Could not connect (connection)<br>" . DB::errorMessage($this->connection));
        }
    }

    function closedbconnection(){
        $this->connection->disconnect();
    }
}

class dbinteractions {

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

   function searchdb($qstring) {
    if (get_magic_quotes_gpc()) {
        $qstring = stripslashes($qstring);
    }

    $qstring = mysql_real_escape_string($qstring);

    $query = "SELECT content FROM site_content WHERE content LIKE '%$qstring%'";
    $result = $this->connection->query($query);

    if(DB::isError($result)) {
        die("Could not connect (query)<br>" . DB::errorMessage($result));
    }

    while($result_row = $result->fetchRow()) {
        echo("<h2>Resultat:</h2>");
        foreach($result_row as $out)
            echo($out . "<p>");
    }
}

    function getpagecontent($page) {
        $query = "SELECT * FROM site_content WHERE (page_id = \"" . $page . "\")";
        $result = $this->connection->query($query);;

        while($result_row = $result->fetchRow()) {
            echo "<h1>" . $result_row[0] . "</h1>"; //Echo page_id
            echo $result_row[1]; //Echo content
            echo "<h2>" . $result_row[2] . "</h2>"; //Echo timestamp
        }
    }

}
?>

的search.php

<?php
function displaysearchform()
{
    echo("<p></p>");
    if($_GET["search"] == '') { //Display search box if no search ?>

        <form method="GET" action="<?php echo(htmlentities($_SERVER['PHP_SELF'])); ?>">
            <label>
                Search: <input type="text" name="search" />
            </label>
            <input type="submit" value="Go!">
        </form>

    <?php
        return false;
    }
    else
    {
        return true;
    }
}

?>

的index.php

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<link rel="stylesheet" href="style.css" type="text/css">
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title></title>
</head>
<body>
    <div id="container">
        <div id="sidebar">
            <a href="?id=1">1</a><br>
            <a href="?id=2">2</a><br>
        </div>
        <div id="main">

            <?php
                include("dbfunctions.php");
                include("search.php");

                $dbconnect = new dbconnect();

                $dbconnect->createdbconnection();

                $dbinteractions = new dbinteractions($dbconnect->connection);

                if(!$_GET["id"] && $_GET["search"] == "") { //Check if direct site hit and no search query
                    $dbinteractions->getpagecontent("1");
                    }

                else  {
                    $page = $_GET["id"];
                    $dbinteractions->getpagecontent($page); //Get and display page content
                }

                if (displaysearchform() == true){ //If search was made don't display searchform
                    $dbinteractions->searchdb($_GET["search"]);
                }

                $dbconnect->closedbconnection(); //Close connection to db
            ?>
        </div>
    </div>
</body>
</html>

7 个答案:

答案 0 :(得分:1)

我不确定面向对象是什么意思,但是你的代码看起来与传统意义上的类,对象和方法没有任何区别。当大多数人说“OO”时,他们的意思是他们的代码是由你可以调用方法的不同类型的对象构建的。

对我而言,您的代码看起来像典型的程序代码。

答案 1 :(得分:1)

您当然正确使用对象,并且您正确地访问它们。从外观来看,你的DB对象是单身,这很好。你正在使用' - &gt;'访问其他对象方法和属性。

但看起来你正在重新实现应该成为DB对象一部分的功能。例如,有了我自己的DB类,我就会做这样的事情

$db = DBObject::getInstance(); // The DB object is a singleton

$sql = "Select * from.... etc etc";

$result = $db->query($sql);

我认为应该完成你尝试过的所有事情。 DB对象应该知道如何自己连接到数据库,发出自己的错误消息并在需要时关闭连接(它可能不需要)。处理引号,斜杠和确保Query安全的东西都可以在DB对象内部处理。

但是,您尝试执行的过程很容易就是它自己的一个类(例如:PageRenderer)。但是在这里你已经创建了很多使用其他对象的函数。

但很难直截了当地回答你。是的,你做得对,但你似乎做得太多了。

答案 2 :(得分:1)

我认为当你真的喜欢写OO时,你应该使用相互交互的对象来完成手头的任务。我没有看到任何从类实例化的对象,所以我认为这不是适当的面向对象的代码。如果你问我,这是更多的程序代码。

答案 3 :(得分:1)

OO只有一件事。 $ connection对象。

其他一切都是程序性的。您应该首先创建一个类,而不是“dbfunctions.php”中的所有松散函数。

另请注意,应避免将逻辑代码与HTML混合使用。它很难维护。

这可能是the best book you can read on the subject

进入面向对象的范式并不容易。但是当你得到它时,就像骑自行车一样。你永远不会忘记。

答案 4 :(得分:1)

我不能说这里有太多的OOP,但它听起来更像你正在尝试用参数学习一个好方法而不是使用全局变量 - 你似乎已经完成了。

如果你想从这段代码中提高更多,这里有一些指示

  • 尝试使用一致的编码风格。例如,PEAR coding standard通常用于PHP
  • 将数据库代码更改为一个封装连接对象的类。例如,您可以使用方法 connect 搜索关闭
  • 的Database类
  • 在HTML代码中使用一些模板解决方案。您可以将PHP本身用作模板语言,demonstrated here。主要思想是将“应用程序逻辑”与“视图逻辑”分开。
  • 您可能还想修改使用echo来简单返回结果的函数,并使用另一个函数(或模板中的代码)来输出它们。通常,您需要一个函数提供/获取数据或输出数据,而不是两者。

最后,我建议查看一些流行的PHP框架,因为它们通常遵循良好的OOP编码风格。 CakePHP应该很容易入手,但因为它使用PHP4,所以它并不总能很好地完成OOP。你可以对Cake的原则感到满意,然后继续使用像Symfony或Zend Framework这样的东西。在我开始使用Zend Fw后,我自己的编码风格变得更好。

答案 5 :(得分:0)

我对面向对象的php编程有一点建议;首先阅读php.net中的文档,最后你应该阅读No Starch Press出版的“面向对象的PHP”一书 - &gt; http://nostarch.com/oophp.htm

此外,在您的类/函数文件的顶部使用此语句,您将包含(search和dbfunctions.php)

if(!defined('page'))exit('不允许直接访问脚本');

并定义使用此类的页面 - 如下面的示例所示:

定义( “页”, “搜索”); 包括( “dbfunctions.php”); 包括( “search.php中”);

答案 6 :(得分:0)

我想保持简单直接。这是我使用的一个类,用于Jason Gilmore的书中从PHP开始到MySQL:从新手到专业

<?php

class SQL {


    function __construct() {

        $this->host     = "xxx";

        $this->user     = "xxx";

        $this->password  = "xxx";

        $this->database  = "xxx";



        $this->result;

        $this->querycount;

        $this->connect();

        $this->select();        

    }



    function connect() {

        $this->linkid = @ mysql_connect($this->host, $this->user, $this->password);

        if(!$this->linkid) {

            echo "--[ could not connect to sql database ]--";   exit();

        }

    }



    function select() {

        if(!@ mysql_select_db($this->database, $this->linkid)) {

            echo "--[ could not select database ]--";   exit();

        }

    }




    function escape($data) {

        return mysql_real_escape_string(trim(htmlspecialchars($data)), $this->linkid);

    }



    function query($query) {

        if( $this->result = @ mysql_query($query, $this->linkid) ) {

            $this->querycount++;

            return true;

        } else {

            echo "<b>Error:</b>" . mysql_error($this->linkid);              

            return false;

        }   

    }



    function affectedRows() {

        $count =  @ mysql_affected_rows($this->linkid);

        return $count;

    }



    function numRows() {

        $count = @ mysql_num_rows($this->result);

        return $count;

    }



    function fetchObject() {

        $row = @ mysql_fetch_object($this->result);

        return $row;

    }



    function fetchRow() {

        $row = @ mysql_fetch_row($this->result);

        return $row;

    }



    function fetchArray() {

        $row = @ mysql_fetch_array($this->result);

        return $row;

    }



    function fetchAssoc() {

        $row = @ mysql_fetch_assoc($this->result);

        return $row;

    }



    function numQueries() {

        return $this->querycount;

    }

}



?>

我不是说这是最好的方式。但它非常简单直接;并且也应该改为使用mysqli,但我一直懒惰= p