Правильно ли написан этот php-код в соответствии с принципами ОО? - PullRequest
1 голос
/ 20 июня 2009

Я пытался разобраться в ориентации объекта, и я думаю, что iv начал понимать некоторые концепции, но я не уверен. Сделать поиск в Google, который отвечает, если мой ход мыслей верен, оказалось довольно сложно, поэтому я решил спросить здесь очень быстро, пожалуйста, скажите мне, если вопрос противоречит каким-либо правилам.

Я правильно думаю, что касается передачи сообщений? Какие явно плохие вещи? Как я должен думать, продолжая свое обучение? Как 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 ]

1 голос
/ 20 июня 2009

Я не могу сказать, что здесь действительно много ООП, но это звучит и похоже на то, что вы пытаетесь научиться хорошему подходу с параметрами вместо использования глобальных переменных - чего вы, кажется, достигли.

Если вы хотите улучшить этот код, вот несколько указателей

  • Попробуйте использовать согласованный стиль кодирования. Например, стандарт PEAR обычно используется в PHP
  • Измените код вашей базы данных на класс, который инкапсулирует объект соединения. Например, у вас может быть класс Database с методами connect , search и close
  • Используйте какое-нибудь шаблонное решение с вашим HTML-кодом. Вы можете использовать сам PHP в качестве языка шаблонов, как показано здесь . Основная идея состоит в том, что вы отделяете «логику приложения» от «логики представления»
  • Вы также можете изменить свои функции, которые используют echo, чтобы просто вернуть результат, и использовать другую функцию (или просто код в вашем шаблоне) для их вывода. Обычно требуется, чтобы функция предоставляла / извлекала данные или выводила данные, а не обе.

Наконец, я бы посоветовал взглянуть на некоторые популярные PHP-фреймворки, так как они обычно следуют хорошим стилям кодирования ООП. CakePHP должно быть легко начать, но поскольку он использует PHP4, он не всегда хорошо работает с ООП. Вы можете освоиться с принципами Cake, а затем перейти к чему-то вроде Symfony или Zend Framework. Мой собственный стиль кодирования стал намного лучше после того, как я начал использовать Zend Fw.

1 голос
/ 20 июня 2009

У вас есть только одно право с ОО. Объект $ connection.

Все остальное процедурно. Вы должны начать с создания класса вместо всех этих свободных функций в "dbfunctions.php".

Также обратите внимание, что вам следует избегать смешивания логического кода с HTML. Сложно поддерживать.

Вот, наверное, лучшая книга, которую вы можете прочитать на эту тему .

Нелегко войти в объектно-ориентированную парадигму. Но когда вы получаете это, это все равно что ездить на велосипеде. Вы никогда не забудете.

1 голос
/ 20 июня 2009

Я думаю, что когда вам действительно нравится писать OO, вы должны использовать объекты, которые взаимодействуют друг с другом, чтобы выполнить поставленную задачу Я не вижу объектов, созданных из классов, поэтому я не думаю, что это правильный объектно-ориентированный код. Это более процедурный код, если вы спросите меня.

1 голос
/ 20 июня 2009

Вы, безусловно, правильно используете объекты и правильно к ним обращаетесь. Вы - объект БД, по внешнему виду это единственный объект, это хорошо. И вы используете '->' для доступа к другим методам и свойствам объекта.

Но, похоже, вы реализуете функциональность, которая должна быть частью объекта БД. Например, с моим собственным классом БД я бы сделал что-то вроде этого

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

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

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

Что, я думаю, должно выполнить все, что вы пытались сделать. Объект БД должен знать, как самостоятельно подключаться к базе данных, выдавать свои собственные сообщения об ошибках и закрывать соединение в случае необходимости (чего, вероятно, нет). И такие вещи, как обработка кавычек, косая черта и обеспечение безопасности вашего запроса, также могут обрабатываться внутри объекта БД.

Кроме того, процедура, которую вы пытаетесь выполнить, может легко представлять собой отдельный класс (например, PageRenderer). Но здесь вы создали много функций, которые используют другие объекты.

Но трудно дать вам прямой ответ. Да, вы делаете это правильно, но вы, кажется, делаете слишком много.

1 голос
/ 20 июня 2009

Я не уверен, что вы подразумеваете под объектно-ориентированным, но ваш код не выглядит как ОО-код в традиционном смысле классов, объектов и методов. Когда большинство людей говорят «ОО», они имеют в виду, что их код состоит из объектов различных типов, к которым можно вызывать методы.

Для меня ваш код выглядит как типичный процедурный код.

0 голосов
/ 21 июня 2009

Мне нравится, чтобы все было просто и понятно. Вот класс, который я использую, который использовался в книге Джейсона Гилмора

"Начинающий 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

0 голосов
/ 21 июня 2009

У меня небольшой совет по объектно-ориентированному php-программированию; сначала прочитайте документацию на php.net и, наконец, прочитайте книгу «Объектно-ориентированный PHP» от No Starch Press -> http://nostarch.com/oophp.htm

Кроме того, используйте это утверждение в верхней части ваших файлов классов / функций, включая: (search and dbfunctions.php)

if (!fined ('page')) exit ('Прямой доступ к сценарию запрещен');

и определите страницу, которая использует этот класс - как в примере ниже:

определить ( "страницы", "поиск"); включают в себя ( "dbfunctions.php"); включают в себя ( "search.php"); * +1010 *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...