2012-03-30 2 views
2

OOP를 처음 사용합니다. 원래 변수를 정의하고 생성자 외부의 클래스 및 값을 값에 할당했지만 Java의 OOP 레슨이 끝나면이 스타일이 좋지 않으므로 피해야합니다. PHP : 데이터베이스 연결 클래스 생성자 메서드

class DatabaseConnection { 
    private $dbHost = "localhost"; 
    private $dbUser = "root"; 
    private $dbPass = ""; 
    private $dbName = "test"; 

    function __construct() {  
     $connection = mysql_connect($this->dbHost, $this->dbUser, $this->dbPass) 
      or die("Could not connect to the database:<br />" . mysql_error()); 
     mysql_select_db($this->dbName, $connection) 
      or die("Database error:<br />" . mysql_error()); 
    } 
} 

가 위 괜찮 간주됩니다

:

여기에 내가 조롱 업 내 원래 PHP 데이터베이스 연결 클래스는 무엇입니까? 아니면 다음과 같은 좋은 방법입니까?

class DatabaseConnection { 
    private $dbHost; 
    private $dbUser; 
    private $dbPass; 
    private $dbName; 

    function __construct() { 
     $this->dbHost = "localhost"; 
     $this->dbUser = "root"; 
     $this->dbPass = ""; 
     $this->dbName = "test"; 

     $connection = mysql_connect($this->dbHost, $this->dbUser, $this->dbPass) 
      or die("Could not connect to the database:<br />" . mysql_error()); 
     mysql_select_db($this->dbName, $connection) 
      or die("Database error:<br />" . mysql_error()); 
    } 
} 

OOP을 올바르게 이해하기 위해 무엇을 집중해야합니까?

+4

잠시 OOP를 잊어 버리자. 호스트, 사용자, 암호 및 dbname 값을 구성 파일에 저장하면 안됩니까? – Joni

+0

@Aaron, 업데이트 된 답변을 확인하십시오. 설치시 고려해야 할 몇 가지 항목을 추가했습니다. –

+3

@JoniSalonen, 어디에 보관됩니까? 요점은 생성자에서 매개 변수로 전달되어야한다는 것입니다. –

답변

8

글쎄, 아직 실행되지 않을 것입니다. 나는 일반적으로 모든 클래스의 내부에 내 로그인 PARAMS을 넣지 마십시오

$dbHost = "localhost"; 

$this->dbHost = 'localhost'; 

해야합니다 그들은 당신의 연결 PARAMS 일치하도록 당신은 당신의 변수를 변경해야합니다. 객체가 생성되면 생성자로 전달합니다. 외부 구성 파일을 사용하여 두 개 이상의 빌드에서이 클래스를 실제로 사용할 수 있습니다. :)

업데이트 ::

좋아, 여기에 동적 데이터베이스 클래스를 구축 할 수 있도록 몇 가지 작은 OOP 구성 금 덩어리이다.

  • 그것은 당신이 데이터 모델링의 사이비의 ORM 스타일을 할 수 밖에 http://redbeanphp.com/ 확인합니다. 설치가 쉽고, 데이터베이스를 설치하고 실행하기가 쉽지 않습니다.

  • http://redbeanphp.com/manual/installing는 상수, 템플릿 설정, 일반 기능 등을 포함하는 구성 파일을 작성 및 버전 관리되는 환경에서 작업 할 때 AUTOLOADER 구성 파일은 열쇠입니다. :)

  • 는 추상 클래스 라이브러리 폴더에 클래스 파일을 모두 넣어 http://php.net/manual/en/language.oop5.abstract.php

    abstract class Database 
    { 
        public function update() 
        { 
        } 
    
        public function deactivate() 
        { 
        } 
    
        public function destroy() 
        { 
        } 
    
        //etc. 
    } 
    
    class MyAppObject extends Database 
    { 
    } 
    
  • 로 데이터베이스 클래스를 빌드하고 해당 라이브러리에 구성 파일을 넣어. 이제는 삶을 더 편하게하기 위해 자동 로더 기능을 사용하여 필요할 때마다 특정 수업을 포함하지 않고도 수업에 활기를 불어 넣을 수 있습니다. 아래를 참조

    //note: this is never explicitly instantiated 
    //note: name your files like this: MyAppObject.class.php 
    function my_fancypants_autoloader($my_class_name) 
    { 
        if(preg_match("%^_(Model_)%", $my_class_name)) return; 
        require_once("$my_class_name.class.php"); 
    } 
    spl_autoload_register('my_fancypants_autoloader'); 
    
    • 지금 당신이해야 할 모든 클래스를 액세스 할 수 .PHP 파일의 하나 개의 구성 파일을 포함합니다. 올바른 방향으로 포인트

희망! 행운을 빕니다!

0

__construct 메소드에만 사용하고 있으므로 클래스 속성으로 지정할 필요가 없습니다. $connection 만 나중에 imho를 사용하기 위해 보관해야합니다.

이러한 인수에 기본값을 지정하지 않고 외부에서 설정하도록하는 것이 훨씬 더 좋습니다.

$db = new DatabaseConnection("localhost", "user", "password", "db"); 

그들은 이미 PHP 도구를 많이 가지고 있으며, 찾고, 읽고 있습니다. 먼저 PDO을 사용하고 Java에서 true가 PHP에서 항상 사실 인 것은 아닙니다.

0

아마도 후자가 더 좋을지 모르지만 조정을하면 생성자에 연결 인수, 즉 연결 정보를 전달합니다.

첫 번째 예제는 데이터베이스 연결이 하나 뿐이고 연결 값을 하드 코딩하는 경우에만 유용합니다 (그렇게해서는 안됩니다). 두 번째 예를 말하면, $name 매개 변수를 인수로 추가하면 여러 데이터베이스에 연결할 수 있습니다.

저는 OOP를 처음 사용합니다. 원래 변수를 정의하고 생성자 외부의 클래스 및 값을 값에 할당했지만 Java의 OOP 레슨이 끝나면이 스타일이 좋지 않으므로 피해야합니다.

class DatabaseConnection { 
    private $dbHost; 
    private $dbUser; 
    private $dbPass; 
    private $dbName; 

    function __construct($config) { 
     // Process the config file and dump the variables into $config 
     $this->dbHost = $config['host']; 
     $this->dbName = $config['name']; 
     $this->dbUser = $config['user']; 
     $this->dbPass = $config['pass']; 

     $connection = mysql_connect($this->dbHost, $this->dbUser, $this->dbPass) 
      or die("Could not connect to the database:<br />" . mysql_error()); 
     mysql_select_db($this->dbName, $connection) 
      or die("Database error:<br />" . mysql_error()); 
    } 
} 

그래서이 스타일을 사용하면 더 유용한 클래스가 생깁니다. 여기

0

내이며 오히려 잘 작동 :

class Database 
{ 
    private static $_dbUser = 'user'; 
    private static $_dbPass = 'pwd'; 
    private static $_dbDB = 'dbname'; 
    private static $_dbHost = 'localhost'; 
    private static $_connection = NULL; 

    /** 
    * Constructor 
    * prevents new Object creation 
    */ 

    private function __construct(){ 
    } 

    /** 
    * Get Database connection 
    * 
    * @return Mysqli 
    */ 

    public static function getConnection() { 
     if (!self::$_connection) { 
    self::$_connection = @new mysqli(self::$_dbHost, self::$_dbUser, self::$_dbPass, self::$_dbDB); 

     if (self::$_connection -> connect_error) { 
      die('Connect Error: ' . self::$_connection->connect_error); 
     } 
     } 
     return self::$_connection; 
    } 
} 

__construct가 비어함으로써, 그것은 새로운 클래스가 어디에서 인스턴스화하는 것을 방지 할 수 있습니다. 그런 다음 함수를 정적으로 만들어 이제 연결을 얻으려고하면됩니다. Database::getConnection() 그리고이 파일은 모두 include 파일에 있으며 서버의 암호로 보호 된 폴더에 있으며 각 클래스 파일에 포함되어 있습니다. 또한 다른 연결을 시도하기 전에 연결이 이미 열려 있는지 확인합니다. 이미 설정되어있는 경우 열린 연결을 메서드에 전달합니다.

+0

그리고 가능하다면 (대부분의 경우 ** 가능하다.)' 루트 사용자! 혹시 보안 침해가 있었다면 DB는 토스트입니다. 최소한의 사용 권한을 가진 두 번째 계정을 만듭니다. 보조 계정에서 레코드를 삭제할 수도 없습니다. 레코드를 삭제할 수 있어야한다면 해당 권한을 가진 사용자와 함께 다른 데이터베이스 클래스를 만들고 필요한 메서드 만 호출하면됩니다. –

+1

모든 정적 클래스를 사용하는 경우 OOP가 아닙니다. 전역 변수가있는 이전 절차 코드와 같습니다. 네임 스페이스와 같은 역할을하는 클래스에서이 클래스를 래핑하면됩니다. –

+0

그리고 제발! FFS는'@'연산자를 사용하지 말아야합니다. 오류 숨기기는 일반적으로 할 수있는 최악의 경우입니다. –

8

우선 : 이것은 무의미합니다.

10 세 이상의 mysql_* 함수에 대한 개체 래퍼를 만듭니다. 이 PHP 확장은 더 이상 유지 관리되지 않으며 폐기 방법은 already begun입니다. 2012 년에이 새 API를 사용해서는 안됩니다.

대신 PDO 또는 MySQLi을 사용하고 prepared statements으로 작업하는 방법을 배워야합니다. 말했다

은 .. 당신의 코드를 살펴 수 있습니다 :

  • 생성자는 새로운 인스턴스를 생성, 매개 변수는 클래스 정의에 하드 코딩하지 않아야 필요한 모든 매개 변수를 받아야합니다. 동시에 두 개의 데이터베이스로 작업해야한다면 어떻게해야할까요?
  • 연결이 생성되면 개체의 범위 변수에 저장해야합니다. $this->connection = mysql_conn...의 라인을 따라 뭔가가 있습니다. 대신 로컬 변수에 저장합니다. 생성자 바로 다음에 "loose"이 있습니다.
  • 모든 변수에 private 개의 변수를 사용하지 않아야합니다. 원래 클래스를 확장 할 클래스에는 보이지 않습니다. 의도적 인 경우가 아니면 protected을 선택해야합니다.
  • or die('..') 비트가 가장 좋습니다.연결이 실패 할 경우 전체 응용 프로그램을 중지하지 마십시오. 대신 exception을 던져야합니다. 그러면 생성자 외부에서 처리 할 수 ​​있습니다.
+0

다른 데이터베이스에 연결하고 싶다면 그는 쿼리에서 데이터베이스 이름을 지정할 수 있습니다 ... 그런 거시기가되지 마십시오. geez –

+0

@michaelhanon 당신은 실제로 코드를 보았습니까? 그냥 연결 이름을 지정해도 아무런 이점이 없습니다. 그리고 그러한 도구처럼 들리지 않으려면 [OCP] (https://en.wikipedia.org/wiki/Open/closed_principle)에 대해 읽어야합니다. –

+0

@michaelhanon 나는 terēsko보다 더 심하게 침을 흘렸을 것이다. 특히 코멘트에 쓸데없는 것들을 암시하고있다. – dbf

-2
<?php 

    class config 
    { 
     private $host='localhost'; 
     private $username='root'; 
     private $password=''; 
     private $dbname='khandla'; 

     function __construct() 
     { 
      if(mysql_connect($this->host,$this->username,$this->password)) 
      { 
       echo "connection successfully"; 
      } 
     } 
     function db() 
     { 
      mysql_select_db($this->$dbname); 
     } 
    } 

    $obj=new config(); 
?> 
+0

http://php.net/manual/en/function.mysql-connect.php – Vikram