2012-04-05 2 views
1

Я недавно начал работу над уже существующим PHP-приложением, и у меня возникли проблемы, когда я пришел к тому, что я должен улучшить масштабируемость этого приложения. Я из фон C# .NET, поэтому идея разделения проблем не нова для меня.Стандарты для хорошо отделяемого PHP-приложения

Прежде всего, я хочу рассказать вам, что именно я ищу. В настоящее время это приложение имеет довольно большой размер, состоящий из 70 таблиц базы данных и ~ 200 страниц. По большей части эти страницы просто выполняют операции CRUD в базе данных, редко что-либо на самом деле программно интенсивно. Почти все страницы в настоящее время с помощью кода сродни этому:

$x = db->query("SELECT ID, name FROM table ORDER BY name"); 
if ($x->num_rows > 0) { 
    while ($y = $x->fetch_object()) { 
     foreach ($y as $key => $value) 
      $$key = $value; 

Очевидно, что это не подходит для приложения, которое является столь же большой, как один я, как предполагается, будет работать дальше. Теперь я, будучи с фона C# .NET, использую для создания небольших приложений и обычно создаю небольшой бизнес-объект для каждого объекта в моем приложении (почти 1 к 1 соответствует моим таблицам базы данных). Они следуют за форму этого:

namespace Application 
{ 
public class Person 
{ 

      private int _id = -1; 
    private string _name = ""; 

    private bool _new = false; 


    public int ID 
    { 
     get{ return _id; } 
    } 

    public string Name 
    { 
     get { return _name; } 
     set { _name = value; } 
    } 


    public Person(int id) 
    { 
     DataSet ds = SqlConn.doQuery("SELECT * FROM PERSON WHERE ID = " + id + ";"); 

     if (ds.Tables[0].Rows.Count > 0) 
     { 
      DataRow row = ds.Tables[0].Rows[0]; 

      _id = id; 

      _name = row["Name"].ToString(); 
     } 
     else 
      throw new ArgumentOutOfRangeException("Invalid PERSON ID passed, passed ID was " + id);   
    } 

    public Person() 
    { 
     _new = true; 
    } 

    public void save() 
    { 
     if (_new) 
     { 
      doQuery(" INSERT INTO PERSON " + 
       " ([Name]) " + 
       " VALUES " + 
       " ('" + Name.Replace("'", "''") + "'); "); 
     } 
     else 
     { 
      SqlConn.doNonQuery(" UPDATE PERSON " + 
       " SET " + 
       " [Name] = '" + _name.Replace("'", "''") + "' WHERE " + 
       " ID = " + _id); 
     } 

    } 

в более короткие сроки, они просто имеют атрибуты, которые имитируют таблицу, свойства, конструктор, который вытягивает информацию, и метод, называемый save, который будет совершать какие-либо изменения, внесенные в объект ,

На мой вопрос: во-первых, это хороший способ сделать что-то? Это всегда хорошо срабатывало для меня. Во-вторых, и что еще более важно, это также хороший способ сделать что-то в PHP? Я уже заметил, что некорректная нагрузка PHP вызвала у меня проблемы в том, как я это делаю, и перегрузка метода не является совершенно новой. Если это не очень хорошая практика, есть ли хорошие примеры того, как я должен адаптировать этот проект к 3 уровням? Или, возможно, мне не следует пытаться это делать по какой-то причине.

Прошу прощения за длительность вопроса, но я прорывался в Интернете в течение недели или около того, но все, что я когда-либо нахожу, это стандарты синтаксиса, а не стандарты структуры.

Заранее спасибо.

+0

Возможно, вы захотите взглянуть на подход Doctrine 2. http://docs.doctrine-project.org/en/latest/index.html В принципе, человек становится простым старым бизнес-объектом. Материал сохранности базы данных является независимым. – Cerad

ответ

3

Существует несколько шаблонов, за которыми можно следовать. Мне нравится использовать MVC pattern. MVC составляет около splitting user interface interaction into three distinct roles.Однако есть и другие шаблоны, но для ясности (конечная длина сообщения я буду входить только в MVC). На самом деле не имеет значения, какой шаблон вы хотите использовать, пока используете SOLID principles.

Я нахожусь на фоне C# .NET, поэтому идея разделения проблем не нова для меня.

Это замечательно. Попытка изучения PHP будет только деталью реализации на данном этапе.

Очевидно, что это не очень удобно для приложения, которое больше того, над которым я должен работать.

Рад, что мы согласны :-)


В шаблон MVC вы бы:

M Одел: который делает 'всю работу'
V МЭН : который заботится о презентации
C ontroller: обрабатывает запросы

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

Этот объект человека, о котором вы говорили, будет моделью в шаблоне MVC.

Я заметил уже, что рыхлое типирование РНР вызвало у меня проблемы в том, как я делаю вещи

PHP свободно печатать очень сладкий (если вы знаете, что вы делаете) и в том же время может сосать. Помните, что вы всегда можете сделать строгие сравнения с использованием трех = признаков:

if (1 == true) // truthy 
if (1 === true) // falsy 

также нет перегрузки методов не является совершенно новым

PHP действительно не действительно поддержки метода перегрузки, но можно передразнивать. Рассмотрим следующий пример:

function doSomething($var1, $var2 = null) 
{ 
    var_dump($var1, $var2); 
} 

doSomething('yay!', 'woo!'); // will dump yay! and woo! 
doSomething('yay!'); // will dump yay! and null 

Другой способ to do:

function doSomething() 
{ 
    $numargs = func_num_args(); 
    $arg_list = func_get_args(); 
    for ($i = 0; $i < $numargs; $i++) { 
     echo "Argument $i is: " . $arg_list[$i] . "<br />\n"; 
    } 
} 

doSomething('now I can add any number of args', array('yay!', 'woo!', false)); 

Или, возможно, я не должен пытаться сделать это по какой-то причине.

Конечно, вы должны попробовать. Когда у вас уже есть опыт программирования, это не должно быть слишком сложно.


Если у вас есть какие-либо другие вопросы, вы можете можете найти меня на холостом ходу в PHP chat завтра (я действительно нужно немного поспать прямо сейчас :-)).

0

Это хороший способ сделать что-то?

Не существует идеального способа; есть хорошая и плохая для определенной ситуации.

О наборе текста, PHP не потеряет его; мы называем эту динамическую типизацию.

О архитектуре, когда мы разрабатываем веб-приложения уровня предприятия, от среднего до крупного, мы склонны говорить о производительности на ежедневной основе.

Хорошая точка для начала было бы читать о некоторых из самых известных фреймворками, как:

  • Зенд
  • Symfony
  • Kohana

Из этого вы можете начать думать об архитектуре.

+1

http://programmers.stackexchange.com/questions/143178/which-open-source-php-project-has-the-perfect-oop-design-i-can-learn-from/143192#143192 – PeeHaa

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