2012-06-15 3 views
0

저는 DBhelper라는 클래스를 사용했고 UserManager라는 새로운 클래스를 만들었습니다. UserManager에는 GetUserId() 및 CheckValidation()과 같은 기능이 필요하므로 이러한 데이터베이스 작업에는 DBhelper가 필요합니다. 하지만 다음과 같이 작동하지 않는 것으로 나타났습니다.PHP가 여러 클래스로 작동합니다.

require_once('DBhelper.php'); 
class User{ 
    public $databaseHelper = new DBhelper();//syntax error 
    public $DB = $databaseHelper->connectDB();//syntax error 

    public function GetUserId(){ 
    $this->databasesHelper->RunSql();//syntax error 
    ... 
    } 
    public function CheckValidation(){ 
    $this->databasesHelper->RunSql();//syntax error 
    ... 
    } 
} 

저를 중단 시키십시오. 오랫동안 인터넷을 검색했습니다. 감사.

+1

"의존성 주입"으로 검색하셨습니까? –

+0

아니요. 그러나 당신이 말한 후에 나는 이것을한다. 그러나 도움이되지 않습니다. 내가 의존성 주입의 개념을 알고 있지만 PHP에서 이것을 적용하는 방법을 모르겠습니다. 당신의 의견에 감사드립니다. – panda

답변

8

이런 식으로 시도하면 dependency injection 디자인 패턴을 사용합니다. 또한,

// Assuming: require('DBhelper.php'); 
$dbh = new DBHelper(); 
$user = new User($dbh); 

을,이 있습니다 오류가 (그들이 올바른 구문 때문에, 그들은 구문 오류가 아니에요 주) 당신의 오류에 터치 : 여기

class User { 
    private $db; 
    public function __construct(DBHelper $db) { 
     $this->db = $db->connectDB(); 
    } 

    public function GetUserId(){ 
     $this->db->RunSql(); 
    } 

} 

당신이 그것을 인스턴스화하는 방법입니다

public $databaseHelper = new DBhelper();//syntax error 
public $DB = $databaseHelper->connectDB();//syntax error 

멤버 변수를 비 정적 값으로 초기화 할 수 없기 때문에. 따라서 값은 컴파일 타임에 알려지지 않으므로 오류입니다. 마찬가지로

, 이러한 호출은 : $databasesHelper는 적절한 객체 인스턴스화하지 않았기 때문에
$this->databasesHelper->RunSql();//syntax error 

가 잘못되었습니다.

+0

그래서 전체 DBhelper를 $ db로 _construct에 전달해야합니까? – panda

+0

예,이 예제에서와 마찬가지로 – nickb

+0

@PandaYang : PHP에서는 전체 객체가 아니라 객체 식별자 만 전달합니다. 그 물체는 어딘가에있는 기억 속에 있으며 멀리 떨어지지 않습니다. – hakre

2

생성자 또는 다른 적절한 방법으로 인스턴스 변수를 인스턴스화해야합니다. 인스턴스 변수를 선언하고 인스턴스화 할 수 없습니다.

require_once('DBhelper.php'); 
class User{ 
    public $databaseHelper; 
    public $DB; 

    public function User(){ 
    $this->databaseHelper = new DBHelper(); 
    $this->DB = $this->databaseHelper->connectDB(); 
    } 
    public function GetUserId(){ 
    $this->databaseHelper->RunSql();//syntax error 
    ... 
    } 
    public function CheckValidation(){ 
    $this->databaseHelper->RunSql();//syntax error 
    ... 
    } 
} 
+0

, 정말 도움이됩니다. – panda

1

당신은 아마 당신의 클래스의 외부 데이터베이스 클래스를 노출하고 싶지 않은 당신은 생성자에서 그것들을 초기화 할 수 있습니다

코드는 더 같이해야한다. 이벤트를 더 잘 생성하면 생성자에 전달할 수 있으므로 User 클래스는 인스턴스화 방법을 알 필요조차 없습니다. - 먹이 사슬에서 더 높은 곳에서 생성을 처리 할 수 ​​있습니다 (특히 나중에 사용자가 필요로하는 다른 클래스가있는 경우 특히 그렇습니다. 그들).

class User{ 
    private $databaseHelper; 
    private $DB; 

    public function __construct() { 
     $this->databaseHelper = new DBhelper(); 
     $DB = $databaseHelper->connectDB(); 
    } 

    public function GetUserId(){ 
    $this->databasesHelper->RunSql(); 
    ... 
    } 
    public function CheckValidation(){ 
    $this->databasesHelper->RunSql(); 
    ... 
    } 
} 
+0

이 경우 클래스의 모든 인스턴스 (클래스 User라고 가정 해 봅시다)가 데이터베이스에 대한 새로운 연결을 만드는 것입니까? 5 개의 사용자 객체가 있다면 이것은 나쁠 것입니다. 5 개의 db 연결도 있습니다. – Sliq

+0

@Panique 단일 연결을 사용하려면 User 클래스가 기존 또는 새 연결을 사용할지 여부를 결정하는 대신 DBhelper에 기존 연결을 얻는 논리가 있어야합니다. – Fenton

1

유산과 같이 가치를 부여 할 수 없습니다.
생성자를 만들고 그곳에 기본값을 지정하십시오.

1

나는 당신과 똑같은 일을했습니다. 그러나 나는 db 클래스를 다음과 같이 선언했다.

public class MySqlDatabase 
{ 

private static $connection; 

public static function openConnection() 
{ 
    self::$connection = mysql_connect(DB_SERVER, DB_USER, DB_PASS); 
    if(!self::$connection) 
    { 
     throw new Exception("Connection failed to database"); 
    } 

    mysql_select_db(DB_NAME, self::$connection); 
} 


public static function closeConnection() 
{ 
    if(isset(self::$connection)) 
    { 
     mysql_close(self::$connection); 
    } 
} 

public static function executeQuery($query) 
    { 
     $result = mysql_query($query, self::$connection); 
     if(!$result) 
     { 
      throw new Exception("Query execution failed. " . $query); 
     } 

     return $result; 
    } 
} 

그리고 내 다른 클래스의 내부에서 이렇게 호출합니다.

MySqlDatabase::openConnection(); 
MySqlDatabase::executeQuery(); 
MySqlDatabase::closeConnection(); 

그래서 저는 데이터베이스 연결 논리를 정적이라고 선언합니다. 액세스하기 쉬울 것입니다

관련 문제