2009-08-22 4 views
0

У меня есть класс CORE, который относится только к моему конкретному сайту, т. Е. Выполняет функции, специфичные для сайта. У меня есть класс базы данных (для mysql) и другие классы, такие как доступ, валидатор, загрузка, шаблон и т. Д. И т. Д. Я знаю, что классы php могут расширять только один класс, поэтому почти все мои классы расширяют класс базы данных. Я просматривал общедоступный твиттер-класс, используемый в twitter API. В нем есть функции, которые можно выполнять практически все, что вы могли бы сделать, перейдя непосредственно на сайт, вставлять, удалять, что угодно ... Должен ли я помещать все функции релятивирования сайта в мой класс Core и не допускать его из общей области моих сценариев , Сейчас у меня есть что-то вроде этого ....Является ли общий класс необходимым для сайта PHP-сайта?

Вот пример, так как прямо сейчас у меня есть такие функции, как

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

Внутри этой функции, я выполнять запросы к базе данных для выбора нужной информации, поэтому я не должны делать это напрямую, так как это может стать беспорядочным.

У меня также есть функции для удаления вещи, как

$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

Это довольно распространенная ошибка для людей, новых для объектно-ориентированного программирования. Вы не хотите расширять класс только потому, что он имеет некоторые функции, которые вам нужны. На самом деле, вы можете вообще избегать расширения классов, пока вы начинаете работу. Несмотря на то, что большинство входов в ООП делают большую часть наследования, я бы сейчас стал чистым.

Вместо этого подумайте, как вы можете объединить функции в терминах того, как они используются. Например, скажем, что вы управляете пользователями. Вы должны следить за информацией о пользователях, добавлять пользователей, удалять их и т.д. Вы можете создать классы, как это:

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

Эти классы организованы в соответствии с концепциями, а не в соответствии с тем, что функции вам нужно позвонить.

Когда вы 10 do нужны многоразовые функции для таких вещей, как доступ к базе данных, вы, как правило, хотите, чтобы другой отдельный объект выполнял работу. Поэтому вместо того, чтобы ваш 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 
    } 
} 

Чтобы принять это один шаг вперед, мы имеем статический класс App который содержит соответствующие «singletonish» переменные.

class App 
{ 
    public static $DB = NULL; 
} 

App::$DB = new Connection(); 

Теперь, в любом месте вашего приложения, вы можете сказать:

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

Вообще, то, что я делаю, это добавить метод простой запрос() в мой класс базы данных, который просто принимает SQL является аргументом. Затем я отрисую все свои общие методы CRUD на конкретный класс. поэтому, если у вас есть класс Article, метод deleteArticle() будет проходить в этом классе и расширит класс Article с классом базы данных. используйте $ db-> query ($ sql) внутри этого класса. и т. д. с другими классами ...

Смежные вопросы