2009-08-22 5 views
0

저는 특정 사이트에만 관련된 CORE 클래스가 있습니다. 즉, 사이트 별 기능을 수행합니다. 데이터베이스 클래스 (mysql 용) 및 액세스, 유효성 검사기, 업로드, 템플릿 등등과 같은 다른 클래스가 있습니다. PHP 클래스는 각 클래스를 하나씩 확장 할 수 있으므로 거의 모든 클래스가 데이터베이스 클래스를 확장한다는 것을 알고 있습니다. 트위터 API에 사용 된 공개 트위터 클래스를 살펴 보았습니다. 그 안에는 웹 사이트로 직접 가서 삽입, 삭제 등 모든 작업을 수행 할 수있는 거의 모든 기능을 수행하는 기능이 있습니다. 모든 핵심 관련 클래스 함수를 내 Core 클래스에 넣고 스크립트의 일반적인 범위를 벗어나지 않아야합니까? . 나는 그 함수 내부사이트 PHP 사이트에 일반 클래스가 필요합니까?

$core = new Core(); 
$core->get_user_info($user_id); 
$core->get_user_articles($user_id); 

같은 기능을 가지고 지금의로 지금은 내가 그래서 난 그나마 필요한 정보를 선택하기 위해 데이터베이스 쿼리를 수행, Heres는이 같은 ....

예를 지저분해질 수 있기 때문에 직접해야합니다.

나는 또한 내가 삽입하는 기능을 가지고 있겠지, 그러나

$core->Delete_Article($article_id); 

같은 일을 삭제하는 기능을 가지고 있습니다. 대신 Database 클래스를 직접 사용하여 정보를 추가합니다.

$article = array(user_id => $_SESSION['user_id'], body => $_POST['body']); 
$db = new Database(); 
$db->Insert($article, 'articles'); 

또는 지금

$user = array(name => $_POST['name'], email => $_POST['email']); 
$db->Insert($user, 'users'); 

는 서로 한 측면의 분리의 주제에, 나는 내 데이터베이스의 모든// 삽입/업데이트를 선택 내 일반 CORE 클래스 내에서 쿼리를 삭제 할 놓아야합니다 백그라운드의 모든 데이터베이스 작업

$ db-> Insert() 대신 $ core-> insert_user()를 사용하거나 계속 진행할 수 있습니다.

답변

2

이것은 객체 지향 프로그래밍에 익숙하지 않은 사람들에게 아주 흔한 실수입니다. 필요한 기능이 있기 때문에 클래스를 확장하고 싶지는 않습니다. 실제로, 시작하는 동안 클래스를 확장하지 않는 것이 좋습니다. OOP에 대한 대부분의 소개는 많은 상속에서 나옵니다 만, 나는 그 순간을 분명히 알릴 것입니다.

대신, 사용되는 방식에 따라 함수를 그룹화하는 방법을 생각해보십시오. 예를 들어 사용자를 관리한다고 가정 해 보겠습니다.

class User { 
    function getName()... 
    function getID()... 
} 
class UserAdmin { 
    function addUser(User $user)... 
    function getUser($id)... 
    function deleteUser($id)... 
} 

이 클래스는 호출 할 필요가 기능 내용에 따라하지, 개념에 따라 구성되어 있습니다 : 당신은 당신이 같은 클래스를 만들 수 등을, 사용자를 추가, 사용자 정보를 추적 삭제해야합니다.

할 때을 사용하면 데이터베이스 액세스와 같은 기능을 다시 사용할 수 있어야하므로 일반적으로 작업을 수행하는 별도의 다른 개체가 필요합니다. 그래서 대신 UserAdmin 클래스 을 가진의는 SQL 형식을에게 데이터베이스 클래스를 확장 : ...

// wrong 
class UserAdmin extends Database { 
    function getUser($id) { 
    $this->openConnection(); 
    $this->runQuery("select * from users where id = {1}", $id); 
    } 
} 

을 할 수 있습니다 단지 사용 당신의 UserAdmin 클래스 내에서 데이터베이스 클래스 :

// right 
class UserAdmin { 
    function getUser($id) { 
    $db = new Database(); 
    $db->openConnection(); 
    $db->runQuery("select * from users where id = {1}", $id); 
    } 
} 
class Database { 
    function openConnection() ... 
    function runQuery() ... 
} 

처음에는 더 많은 일처럼 보이지만 다양한 클래스를 독립적으로 유지합니다. 따라서 작성, 유지 보수 및 테스트가 더 쉬워집니다.

0

PHP는 각 페이지 뷰에을 로 다시로드하기 때문에 모든 클래스를 인스턴스화하는 데별로 도움이되지 않습니다. 기능을 데이터베이스 스키마와 대략 일치하는 파일로 분해하면 각 페이지 히트에로드되는 기능을 추가하지 않고도 확장 및 확장 할 수 있습니다.

수십 또는 수백 개의 테이블/클래스가있는 경우 중요합니다.

은 특히 PHP를 위해, 우리는이 스타일을 선호 :

class Member 
{ 
    public static function Insert($aData) 
    { 
     //Insert member and return ID 
    } 
    public static function Select($Member_ID) 
    { 
     //select member and return Array 
    } 

    public static function List($aFilter) 
    { 
     //Return list of members filtered by specific criteria 
    } 
} 

가 한 단계 더 걸릴하기를, 우리는 관련 "singletonish"변수를 보유하고 정적 클래스 App 있습니다.

class App 
{ 
    public static $DB = NULL; 
} 

App::$DB = new Connection(); 

이제 어디서나 앱에, 당신은 말할 수 :

App::$DB->Query(...); 
0

일반적으로, 내가 뭘 단지 SQL 인수입니다 걸리는 내 데이터베이스 클래스에 간단한 쿼리() 메서드를 추가합니다. 그런 다음 모든 일반 CRUD 메소드를 특정 클래스로 추상화합니다. 그래서 당신이 Article 클래스를 가지고 있다면, deleteArticle() 메소드는 그 클래스에 들어가고 Article 클래스를 데이터베이스 클래스로 확장 할 것입니다. 해당 클래스 내에서 $ db-> query ($ sql)를 사용하십시오. 다른 수업과 함께 ...

관련 문제