1

のコード スニペットclass lnemail_fetch

<?php  Part of heritage_classes.php
// Declare classes
class lnemail_fetch {
// return string in format "title | factoid" 
    public  $result;
    public function get_ln_info() 
    {
    include ("./includes/LOheritage-config.php");
    mysql_connect("$dbhost", "$dbuser", "$dbpass") or die(mysql_error());
    mysql_select_db("$dbname") or die(mysql_error());
      $query = "SELECT * FROM lnemail";
     $result = mysql_query($query);
         $this->result = $result;
    }
}
?>

より大きなプログラムからのコード スニペット MySQL テーブルを一覧表示します

    require_once('./includes/heritage_classes.php'); 

    $newlnemail_fetch = new  lnemail_fetch;
     $newlnemail_fetch->get_ln_info();
     $newresult  = $newlnemail_fetch->result;
     echo  "lnemail File display  <br />"; 

      while($row = mysql_fetch_array($newresult))
        {
         echo $row['ln_email']. "  |  " . $row['ln_date'] . "  |  " . $row['ln_week'] ;
          echo "<br />";

        }

この PHP OOP の使用は、今のところ問題なく動作しますが、良い習慣と見なされますか?

4

3 に答える 3

0

いいえ、それはOOPの良い使い方ではありません。

改善分野:

データベース接続とクエリを分離します。db結果の処理を分離します。反復可能な結果オブジェクトを実装することをお勧めします。mysql拡張機能を使用せず、mysqliに切り替えることは非常に良い考えです。また、MySQLへのOOPインターフェースを無料で提供します。

おそらくSQL文字列内の入力をエスケープする側面を考慮する必要がありますが、そのようなコードが示されていないため、これは決定不可能です。

于 2012-10-04T17:54:25.657 に答える
0

将来のリリースで壊れますか?

はい、古い(現在)非推奨のmysql_*機能を使用しているためです。

クラスのコード スニペットlnemail_fetch

この名前lnemailはクラスの名前としてはあまり適切ではありません。見たときにln意味がわからないからです。また、クラス名は多くUpperCamelCasedの場合メソッドcamelCasedです。

実際にコードを見てみましょう:

クラスを見ると、それは単なるクラスであり、現在 OOP とは何の関係もありません。私がしたことは、$resultプロパティを非公開にすることでした。現在、あなたは単にデータのコンテナであるためです。また、データベース(またはあなたが持っているストレージ)からのデータへのアクセスを担当する別のクラスを紹介します。また、1 つのメールを表す別のクラスと、これらのメール オブジェクトを構築するファクトリ クラスを紹介します。これは次のようになります。

// inbox が正しい名前かどうかはわかりません。クラスが何を表しているのかよくわからないからです

class Inbox
{
    private $storage;

    private $mailFactory;

    public function __construct($storage, $mailFactory)
    {
        $this->storage     = $storage;
        $this->mailFactory = $mailFactory;
    }

    public function fetchAllMails()
    {
        $mailRecordset = $this->storage->fetchAll();

        $mails = array();
        foreach ($mailRecordset as $mailRecord) {
            $mails[] = $this->mailFactory->create($mailRecord);
        }

        return $mails;
    }
}

class InboxStorage
{
    private $dbConnection;

    public function __construct(\PDO $dbConnection)
    {
        $this->dbConnection = $dbConnection;
    }

    public function fetchAll()
    {
        $stmt = $this->dbConnection->query('SELECT * FROM lnemail');

        return $stmt->fetchAll(\PDO::FETCH_ASSOC);
    }
}

class Email
{
    private $email;

    private $date;

    private $week;

    public function __construct($email, $date, $week)
    {
        $this->email = $email;
        $this->date = $date;
        $this->week = $week;
    }

    public function getEmail()
    {
        return $this->email;
    }

    public function getDate()
    {
        return $this->date;
    }

    public function getWeek()
    {
        return $this->week;
    }
}

class EmailFactory
{
    public function create($record)
    {
        return new Email($record['email'], $record['date'], $record['week']);
    }
}

そして、次のように実行できます。

// initialize all the objects we are going to need
$emailFactory = new EmailFactory();
$dbConnection = new \PDO('mysql:dbname=dbtest;host=127.0.0.1;charset=utf8', 'user', 'pass');
$dbConnection->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$dbConnection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$inboxStorage = new InboxStorage($dbConnection);
$inbox = new Inbox($inboxStorage, $mailFactory);

// run the code
foreach($inbox->fetchAllMails() as $email) {
    echo $mail->email . ' | ' . $mail->date . ' | ' . $mail->week . '<br>';
}
于 2013-02-27T21:03:44.807 に答える
-1

lnemail_fetchオブジェクトではないため、実際には真のクラスではありません。あなたがしているのは、コンテナーを作成することと、コンテナーを作成して、静的であり、結果を割り当てるのではなく結果を返す可能性のある関数を呼び出すことだけです。

より良いクラスには、古いmysqlimysql ではなく新しいものが含まれ、次のように機能する可能性があります。行をオブジェクトにし、列をプロパティ (変数;

<?php
class lnemail {
    public $ln_emai;
    public $ln_date;
    public $ln_week;

    public static function Fetch($dbhost,$dbuser,$dbpass,$dbname) {
      $db = new mysqli($dbhost, $dbuser, $dbpass,$dbname) or die(mysql_error());
      $query = "SELECT * FROM lnemail";
      $result = $db->query($query);
      $returnArr = array();
      while($obj = $result->fetch_object('lnemail') {
         $returnArr[] = $obj;     
      }
      return $returnArr;
    }
}

それで

 <?php
 require_once("./includes/LOheritage-config.php");
 require_once('./includes/heritage_classes.php');
 $lnemails = lnemail::Fetch($dbhost,$dbuser,$dbpass,$dbname);
 echo  "lnemail File display  <br />";
 foreach($obj as $lnemail) {
      echo $obj->ln_email. "  |  " . $obj->ln_date . "  |  " . $obj->ln_week;
      echo "<br />";
 }
于 2012-10-04T19:09:11.523 に答える