2012-04-05 3 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 배경에서 소규모 응용 프로그램을 작성하고 일반적으로 응용 프로그램의 각 개체에 대해 작은 Business Object를 구축하는 데 익숙해졌습니다 (거의 데이터베이스 테이블과 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 기본적으로 Person은 평범한 오래된 비즈니스 객체가됩니다. 데이터베이스 지속성은 독립적입니다. – Cerad

답변

3

몇 가지 패턴이 있습니다. 나는 MVC pattern 자신을 사용하고 싶습니다. MVC는 약 splitting user interface interaction into three distinct roles입니다.그래도 다른 패턴이 있지만 명확성을 위해 (게시물의 끝 길이는 MVC로만 이동합니다). SOLID principles을 사용하는 한 어떤 패턴을 따르고 싶은지는 중요하지 않습니다.

나는 C# .NET 백그라운드에서 왔기 때문에 걱정의 분리라는 아이디어는 나에게 새롭지 않습니다.

PHP를 배우려고하면이 시점에서 구현 세부 사항이 될 것입니다.

분명히 이것은 내가 작업하기로되어있는 것만 큼 큰 응용 프로그램에는 좋지 않습니다.

M ODEL : '모든 일'
V iew를 수행 우리는 당신이 가지고있는 것 인 MVC 패턴에서 :-)


동의

다행 : 프레젠테이션을 처리하는 사람
ontroller : 요청을 처리하는 사람

페이지 요청시 컨트롤러에서 처리합니다. 컨트롤러가 일부 작업 (예 : 사용자 확보)을 수행해야하는 경우 모델에서이를 수행하도록 요청합니다. 컨트롤러에 필요한 모든 정보가 있으면 뷰를 렌더링합니다. 보기 은 모든 정보를 렌더링합니다.

당신이 말한 사람 객체는 MVC 패턴의 모델입니다.

내가 PHP의 느슨한 입력이 나에게 방법에 문제가 발생했습니다 것을 이미 눈치 챘을 내가 일

PHP 느슨한 입력 꽤 달콤한 할 (당신은 당신이 무엇을하고 있는지 알고있는 경우)과 같은에서 시간은 빨 수 있습니다. 당신은 항상 세 가지 = 징후 사용하여 엄격한 비교를 할 수있는 기억도있는 방법 오버로드는하지 않습니다 정말 지원 방법 오버로드 실제로 완전히 새로운

PHP 없지만,

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

그것을 흉내낼 수 있습니다. 아마도 내가 어떤 이유로이 작업을 수행하려고 시도해서는 안

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

을 또는 :

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 것 다음 고려하십시오.

물론 시도해야합니다. 이미 프로그래밍 경험이 있으면 너무 열심히해서는 안됩니다.


당신은 당신이 날 (정말이야 :-) 이제 잠을 좀 필요)를 PHP chat 내일 공회전 찾을 수 있습니다 더 이상 질문이있는 경우.

0

이 일을하는 좋은 방법입니다?

더 이상 방법이 없다; 결정된 상황에 대해 좋고 나쁨이 있습니다.

타이핑에 관해서는, PHP는 그것을 풀지 않습니다; 우리는 동적 타이핑이라고 부릅니다. 우리는 중간에서 대규모로 기업 수준의 웹 응용 프로그램을 개발할 때 아키텍처에 대한

, 우리는 매일의 성능에 대해 이야기하는 경향이있다.

처럼, 가장 유명한 PHP 프레임 워크의 일부에 대한 책을 읽은 것입니다 시작하는 좋은 점 :

  • 젠드 당신이 생각을 시작할 수 있습니다으로부터
  • 심포니
  • 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

관련 문제