Bu php kod OO esaslara göre doğru yazılmış mı?

7 Cevap php

Iv nesne yönelimi etrafında başımı almak için çalışıyor ve ben iv bazı kavramların almaya başladı düşünüyorum, ama emin değil im. Soru herhangi kurallara aykırı ise düşünce benim tren ben burada gerçekten hızlı sormaya karar verdim oldukça zor olduğunu kanıtladı doğru olup olmadığını cevapları bir google arama yapma, lütfen söyle.

Im I thinking correctly in regards to messagepassing? What are the obviously bad things? How should I think while going forward with my learning? Like getpagecontent($page, $connection); etc

Atm im reading [Oreilly - Learning php and mysql][1] and [Programming in an Object-Oriented Environment][2] And some books on UML

İşte kodudur.

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 Cevap

Ben gerçekten çok cepten burada var diyemeyiz, ama o sesler ve yerine küresellerle kullanarak parametreleri ile iyi bir yaklaşım öğrenmeye çalışıyoruz gibi daha görünüyor - başarılı gibi görünüyor.

Bu koddan daha fazla geliştirmek istiyorsanız, burada bazı noktalar vardır

  • Tutarlı bir kodlama stilini kullanmayı deneyin. Örneğin, PEAR coding standard PHP yaygın olarak kullanılır
  • Bağlantı nesnesi kapsüller bir sınıf içine veritabanı kodunu değiştirin. Örneğin, yöntemleri ile bir veritabanı sınıfı olabilir connect, search ve close
  • HTML kodu ile bazı çiftleşmiş solüsyonu kullanın. Sen demonstrated here gibi, bir çiftleşmiş dili olarak PHP kendisi kullanabilir. Ana fikir "mantığa" dan "uygulama mantığını" ayrı olduğunu
  • Bunları da echo sadece sonuca dönmek için kullanın ve çıkış (şablonunuzda ya da sadece kod) başka bir işlevi kullanan işlevlerini değiştirmek isteyebilirsiniz. Genellikle, ikisi birden değil, veri veya çıkış veri alıp / bir işlev istiyorum ya sağlayacaktır.

Son olarak, ben genellikle iyi cepten kodlama stilleri takip gibi, popüler PHP çerçeveler bazı bakarak öneririm. CakePHP ile başlamak kolay olmalı, ama PHP4 kullandığı için, her zaman çok iyi OOP yok değil. Sen Kek ilkeleri ile rahat olsun, ve sonra Symfony veya Zend Framework gibi bir şey üzerinde hareket olabilir. Ben Zend Fw kullanmaya başladı sonra kendi kodlama tarzı çok daha iyi anladım.

Ben nesne yönelimli ile ne demek emin değilim, ama kod sınıfları, nesneleri ve yöntemleri geleneksel anlamda OO kodu gibi bir şey görünüyor. Çoğu insan "OO" derken, onların kodu üzerinde yöntemlerini çağırabilir nesnelerin farklı kapalı inşa edilmiş anlamına gelir.

Benim için, kodunuz tipik prosedürel kod gibi görünüyor.

Kesinlikle doğru nesneleri kullanarak konum, ve onları doğru ulasarak ediyoruz. DB nesnesi o iyi, bunun göz göre bir tek konum. Diğer nesne yöntemleri ve özelliklerine erişmek için - '>' ve kullanmakta olduğunuz.

Eğer DB nesnenin parçası olmalıdır işlevselliği uygulama yeniden gibisin Ama görünüyor. Örneğin, ben kendi DB sınıfı ile böyle bir şey yapmak istiyorum

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

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

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

Ben bunu denedim her şeyi başarmak gerektiğini düşünüyorum. DB nesne, kendisi tarafından veritabanına bağlanmak kendi hata iletileri sorunu ve (muhtemelen değil ki) gerekebileceğinden bağlantıyı kapatmak için nasıl bilmeli. Ve tırnak, eğik taşıma ve emin Sorgu güvenli yapma gibi şeyler her yanı DB nesnenin içinde kolları olabilir.

Ama aynı zamanda, gerçekleştirmek için çalışıyoruz prosedür kolayca kendi tüm (: PageRenderer örneğin) bir sınıf olabilir. Ama burada başka nesneleri kullanmak bir çok fonksiyonu oluşturduk.

Ama size düz bir cevap vermek zor. Evet, doğru yapıyoruz, ama çok fazla yapıyor gibi görünüyor.

Ben gerçekten elinizde görevi gerçekleştirmek için birbirleriyle etkileşim nesneleri kullanmanız gerekir OO yazmak istiyorum ne zaman düşünüyorum. Ben bu yüzden bu doğru nesne yönelimli kod olduğunu sanmıyorum sınıflardan örneklenen herhangi bir nesneyi görmüyorum. Bana sorarsanız bu daha usul kodudur.

Sen sadece sağ OO ile bir şey var. $ Bağlantı nesnesi.

Her şey usul olduğunu. Bunun yerine "dbfunctions.php" tüm bu gevşek fonksiyonları, bir sınıf oluşturarak başlamalısınız.

Ayrıca HTML ile mantık kod karıştırma kaçınmak gerektiğini unutmayın. Bu korumak zorlaşıyor.

İşte muhtemelen the best book you can read on the subject.

Bu nesne yönelimli paradigma içine almak kolay değil. Eğer bunu elde zaman, bir bisiklete binmek gibidir. Sen asla unutmayacağım.

Ben nesne yönelimli php programlama hakkında küçük bir tavsiyem var; öncelikle php.net de belgeleri okumak ve nihayet Hayır Nişasta Press tarafından kitap "Object-Oriented PHP" okumalısınız -> http://nostarch.com/oophp.htm

Ayrıca, (arama ve dbfunctions.php) içerecek ile sınıf / fonksiyon dosya üstündeki bu deyimi kullanmak

eğer exit ('izin yok doğrudan komut dosyası erişimi') (('sayfa') tanımlandığı!);

ve bu sınıfı kullanır sayfası tanımlamak - aşağıda numune gibi gibi:

define("page","search"); include("dbfunctions.php"); include("search.php");

i yalındır basit ve onu tutmak istiyorum. Burada Jason Gilmore tarafından kitap Beginning PHP and MySQL: From Novice to Professional kullanılan kullandığım bir sınıf, bu

<?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;

    }

}



?>

Ben en iyi yolu demiyorum. Ama çok basit ve yalındır bulunuyor; ve ayrıca bunun yerine mysqli kullanmak için değiştirilmesi gerekir, ama ben tembel = p oldum