[英]Is this php code written correctly according to OO principles?
iv一直試圖繞開面向對象的方向,我認為iv開始了解一些概念,但是我不確定。 進行谷歌搜索以回答我的思路是否正確被證明非常困難,因此我決定在此快速提出問題,請告訴我該問題是否違反任何規則。
我是否正確考慮了消息傳遞? 什么是明顯的壞事? 在學習過程中我應該如何思考? 像getpagecontent($page, $connection);
等等
Atm im閱讀[Oreilly-學習php和mysql] [1]和[在面向對象的環境中編程] [2]以及有關UML的一些書籍
這是代碼。
<?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
}
}
}
?>
<?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;
}
}
?>
<!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>
我不確定您所說的面向對象是什么意思,但是從傳統的類,對象和方法的意義上講,您的代碼看起來並不像OO代碼。 當大多數人說“ OO”時,他們的意思是說他們的代碼是建立在可以調用方法的不同類型的對象上的。
對我來說,您的代碼看起來像典型的過程代碼。
您當然可以正確使用對象,並且可以正確訪問它們。 從外觀上看,您是DB對象,這很不錯。 而且您正在使用'->'訪問其他對象方法和屬性。
但是看起來您正在重新實現應作為數據庫對象一部分的功能。 例如,使用我自己的數據庫類,我會做這樣的事情
$db = DBObject::getInstance(); // The DB object is a singleton
$sql = "Select * from.... etc etc";
$result = $db->query($sql);
我認為應該可以完成您嘗試做的所有事情。 DB對象應該知道如何自行連接到數據庫,發出自己的錯誤消息,並在需要時關閉連接(可能不需要)。 處理引號,斜杠以及確保查詢安全等之類的東西也都可以在DB對象內部處理。
而且,您嘗試執行的過程可能很容易成為其自己的類(例如:PageRenderer)。 但是,這里您創建了很多使用其他對象的函數。
但是很難給你一個直接的答案。 是的,您做得對,但您似乎做得太多。
我認為,當您真的很想寫OO時,應該使用相互交互的對象來完成手頭的任務。 我看不到任何從類實例化的對象,因此我認為這不是正確的面向對象的代碼。 如果您問我,這是更多的程序代碼。
您對OO只有一件事。 $ connection對象。
其他一切都是程序性的。 您應該首先創建一個類,而不是“ dbfunctions.php”中所有那些松散的函數。
另請注意,您應避免將邏輯代碼與HTML混合使用。 很難維護。
這可能是您可以閱讀的最好的一本書 。
進入面向對象的范式並不容易。 但是,一旦您了解它,就像騎自行車一樣。 你永遠不會忘記。
我不能說這里確實有很多OOP,但是聽起來似乎更像是您在嘗試學習一種使用參數的好方法,而不是使用全局變量-您似乎已經完成了。
如果您想通過此代碼進行更多改進,請參考以下一些指針
echo
的函數以簡單地返回結果,並使用另一個函數(或只是模板中的代碼)來輸出它們。 通常,您希望函數提供/獲取數據或輸出數據,而不是同時提供/獲取數據或輸出數據。 最后,我建議您看一些流行的PHP框架,因為它們通常遵循良好的OOP編碼樣式。 CakePHP應該很容易入手,但是因為它使用PHP4,所以OOP並不總是很好。 您可以對Cake的原理感到滿意,然后繼續使用Symfony或Zend Framework之類的東西。 在我開始使用Zend Fw之后,我自己的編碼風格變得更好了。
我對面向對象的php編程有一些建議; 首先閱讀php.net中的文檔,最后閱讀No Starch Press-> http://nostarch.com/oophp.htm上的 “面向對象的PHP”一書。
另外,在您的類/函數文件的頂部使用此語句,其中將包含(search和dbfunctions.php)
if(!defined('page'))exit('不允許直接腳本訪問');
並定義使用此類的頁面-如以下示例所示:
define(“ page”,“ search”); include(“ dbfunctions.php”); include(“ search.php”);
我喜歡保持簡單明了。 這是我使用的一個類,該類在Jason Gilmore的《 Beginning PHP and MySQL:From Novice to Professional 》一書中使用。
<?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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.