OOP php5 yapısı

3 Cevap php

Ben cepten PHP5 kodu yapmak için çalışıyorlar. Ama benim girişimleri beceriksiz olduğunu düşünüyorum. Bunlar benim sorular şunlardır:

  • Veritabanı yapılandırma bilgilerini içerecek şekilde daha iyi, daha yalın bir yolu var mı?
  • Ben nasılsa ben etrafında yapmak her işlevi $ db = new Db () bildirmek zorunda miyiz?
  • Ben yerine Mysqli_database.php veritabanı soyutlama katmanı olarak PEAR kullanmalı mıyım?

Mysqli_database.php

<?php
class Db {
    private $connection;

    private function open_connection() {
    	if (file_exists('config.inc.php')) {
    		require('config.inc.php');
    	} else {
    		require('../config.inc.php');
    	}
    	try
    	{
    		$this->connection = mysqli_connect($dbhost,$dbuser,$dbpass,$dbname);
    	}
    	catch (Exception $e)
    	{
    		throw $e;
    	}
    }
    private function close_connection() {
    	try
    	{
    		mysqli_close($this->connection);
    	}
    	catch (Exception $e)
    	{
    		throw $e;
    	}
    }
    public function query($query) {
    	try
    	{
    		$this->open_connection();
    		$result = mysqli_query($this->connection,$query);
    		return $result;
    	}
    	catch (Exception $e)
    	{
    		throw $e;
    	}
    	$this->close_connection();
    }
    public function fetchArray($query) {
    	$row = mysqli_fetch_assoc($query);
    	return $row;
    }
    public function count_rows($query) {
    	$row = mysqli_num_rows($query);
    	return $row;
    }
    public function rows_affected() {
    	$row = mysqli_affected_rows($this->connection);
    	return $row;
    }
    public function created_id() {
    	$row = mysqli_insert_id($this->connection);
    	return $row;
    }
}
?>

Test_data.php

<?php
class Test_data {
    public function show_text() {
    	$db = new Db();
    	$sql = $db->query("SELECT * FROM test_table");
    	$row = $db->fetchArray($sql);
    	echo 'This is the output: '.$row['text'];
    }
}
?>

config.inc.php

<?php
$dbname 	= 'database_name';
$dbhost 	= 'localhost';
$dbuser 	= 'database_user';
$dbpass 	= 'database_password';
?>

includes.php

<?php
require_once('config.inc.php');
require_once('Mysqli_database.php');
$db = new Db();
$test_data = new Test_data();
?>

index.php

<?php
require_once('includes.php');
$test_data->show_text();
?>

3 Cevap

Yapılandırma bilgisi tat meselesidir. Ama daha iyi bir yapılandırma nesnede saklanır ve daha sonra başka bir dosyadan global değişkenler de dahil olmak üzere daha OO şekilde retreived olacaktır.

Sen singleton pattern kullanarak yeni bir nesne oluşturma etrafında alabilirsiniz.

Seçtiğiniz daha fazla soyutlanmış katman, o kadar kolay bir veritabanından diğerine taşımak için olacaktır. Ayrıca PDO de bir göz atabilirsiniz.

Singleton, Fabrika ve bazen Kayıt: veritabanı bağlantıları kurulması için bazı gerçekten ortak kalıpları vardır.

Burada bir görünebilir nasıl.

<?php

class DbConn
{
  const CONN_DEV_1  = 'dev.db1';
  const CONN_PROD_1 = 'prod.db1';
  const CONN_DEV_2  = 'dev.db2';
  const CONN_PROD_2 = 'prod.db2';

  protected static $instances = array();

  protected $conn;

  public static function factory( $database, $env )
  {
    $connectionName = "$env.$database";
    if ( !isset( self::$instances[$connectionName] ) )
    {
      switch ( $connectionName )
      {
        case self::CONN_DEV_1:
          $dbname = 'dev1';
          $dbhost = 'localhost';
          $dbuser = 'database_user';
          $dbpass = 'database_password';
          break;
        case self::CONN_PROD_1:
          $dbname = 'prod1';
          $dbhost = 'some.server';
          $dbuser = 'database_user';
          $dbpass = 'database_password';
          break;
        case self::CONN_DEV_2:
          $dbname = 'dev2';
          $dbhost = 'localhost';
          $dbuser = 'database_user';
          $dbpass = 'database_password';
          break;
        case self::CONN_PROD_2:
          $dbname = 'prod2';
          $dbhost = 'some.server';
          $dbuser = 'database_user';
          $dbpass = 'database_password';
          break;
        default:
          throw new Exception( 'Unrecognized database connection!' );
      }
      self::$instances[$connectionName] = new self( $dbhost,$dbuser,$dbpass,$dbname );
    }
    return self::$instances[$connectionName];
  }

  private function __construct( $dbhost, $dbuser, $dbpass, $dbname )
  {
    $this->conn = mysqli_connect( $dbhost, $dbuser, $dbpass, $dbname );
  }

  /* all your other methods here */
}

ve kullanım

$db1 = DbConn::factory( 'db1', 'dev' );

Açıkçası burada nokta gelebilecek her yerde, mevcut uygulama yapılandırma dan $env için değer çekmek.

şimdi kullanım açısından, genellikle el / fonksiyonlar / sınıfları bir veritabanı bağlantısı geçmek ve bağlantısını kendilerini kurmak için onları sorumlu yapmak istemiyorsanız. Bu gevşek bağlantı sunmaktadır. Sizin örnek kullanmak için:

<?php
class Test_data
{
    protected $db;

    public function __construct( DbConn $db )
    {
        $this->db = $db;
    }

    public function show_text()
    {
        $sql = $this->db->query( "SELECT * FROM test_table" );
        $row = $this->db->fetchArray($sql);
        echo 'This is the output: '.$row['text'];
    }
}
?>

Her fonksiyonun bir örneğini yakalamak için olduğu gibi, böyle bir DB nesnesi Singleton deseni için verilen de-facto bir örnektir. Gerçekten burada güzel uyum sağlar.

Burada kaba bir örnek:

class DB
{

   // Private Constructor so external code cannot directly instantiate
   private function __construct() {  

   }

   public static function instance() {
     static $instance = false;

     if (!$instance)
       $instance = new DB();

     return $instance;

   }

}

Ve küçük bir varyasyon, (farklı veritabanları) açık birden fazla DB bağlantıları yapmak istiyorsanız böyle bir örnek yöntem olacaktır:

public static function instance($dsn) {
   static $instances = array();

   if (!isset($instances[$dsn]))
       $instances[$dsn] = new DB($dsn);

   return $instances[$dsn];

}