Общий класс необходим для сайта PHP сайта? - PullRequest
0 голосов
/ 22 августа 2009

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

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

$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 () или просто продолжить, как я делаю.

Ответы [ 3 ]

2 голосов
/ 22 августа 2009

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

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

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);
  }
}

... вы можете просто использовать класс Database из своего класса 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 голосов
/ 22 августа 2009

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

0 голосов
/ 22 августа 2009

Поскольку 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, который содержит соответствующие «синглтонишные» переменные.

class App
{
    public static $DB = NULL;
}

App::$DB = new Connection();

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

App::$DB->Query(...);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...