2011-08-03 6 views
3

컨트롤러 사용에 대한 딜레마가 있습니다. 일반적으로 라우터 (디스패처 또는 프런트 컨트롤러)는 컨트롤러 클래스에서 몇 가지 정적 메서드를 호출합니다. 즉, PageController :: showIndexPage()입니다. 내 컨트롤러는 보통 몇 줄의 코드를 가지고 있으며 보통의 모델로드, 데이터 가져 오기 및보기 전달에 사용됩니다.PHP - 클래스 또는 함수의 정적 메서드

제 질문은 - HTTP 요청 당 하나의 메소드 만 실행되기 때문에 클래스를 피하고 컨트롤러에 대해 단일 함수를 만들어야합니까? 때로는 컨트롤러 당 여러 가지 방법이 있지만 실제로는 하나의 메서드 만 사용됩니다. 그게 큰 문제는 아니지만 아마도 더 나은 시스템을 얻을 수 있을까요? My AuthController는 showLoginPage(), doLogin(), doLogout()과 같은 메소드를 가지고 있습니다. 따라서 클래스를 피하고이 컨트롤러를 여러 함수 (eq auth/show_login_page)로 작성하는 것이 좋습니다. PHP, auth/do_login.php 등등? 이 개념에는 장단점이 있습니까?

업데이트 : 일부 사용자가 정적 메서드의 내 사용을 부 풀리기 때문에, 나는 방어해야합니다 :) 나는 그럴 필요가 없기 때문에 나는 컨트롤러의 인스턴스를 만들지 않습니다. 99 %의 경우 컨트롤러는 모델에서보기로 데이터를 전달하는 데에만 사용됩니다. 그리고 단 하나의 메소드 호출에 대한 인스턴스 작성이 필요하지 않습니다. 이것이 메소드가 정적 인 이유입니다. 다음은 내 컨트롤러 중 하나의 예입니다.

class ArticlesController { 

    static function showArticle($article_id) { 
     $article = ArticlesModel::getArticleById($article_id); 
     View::getInstance()->assignByRef("article", $article); 
     View::getInstance()->display("articles/one.tpl"); 
    } 
    static function showAllArticles() { 
     $articles = ArticlesModel::getAllArticles(); 
     View::getInstance()->assignByRef("articles", $articles); 
     View::getInstance()->display("articles/all.tpl"); 
    } 
} 

답변

2

정적 클래스 함수는 전역 함수와 매우 비슷하기 때문에 컨트롤러에서 정적 클래스 함수를 사용하는 이유를 알지 못하므로 표준 객체 메서드 나 전역 함수로 변경해야합니다.

전역 함수를 가진 모든 컨트롤러를 대체하는 하나의 브랜치와 비 정적 클래스 기능을 가진 다른 브랜치에 전체 앱을 브랜치하는 것이 좋습니다. 그러면 두 개념을 더 잘 비교할 수 있습니다.

포인터를 요구하고 놀고 싶지 않은 경우 모든 정적 클래스 함수를 비 정적 함수로 변환 한 후 다음 문제가 발생할 때까지 계속 진행하십시오.

0

나는 속하는 것을 함께 정리하고 있습니다. 따라서 수업을 사용하십시오. 또한 클래스를 사용하면 자동으로 일종의 네임 스페이스가 생깁니다. 여러 개의 포함 파일에 doSomething()이라는 메서드가있는 경우 두 개 이상의 파일을 포함 할 수 없기 때문입니다. 그러나 메서드가 "정적 클래스"에 들어 있으면 모든 메서드가 여전히 포함될 수 있습니다. PHP 5.3부터 "진짜"네임 스페이스를 사용할 수는 있지만 여전히 클래스 접근법이 더 좋습니다.

상수가 필요하다고 상상해보십시오. 클래스 인 경우 상수는 클래스 범위 안에 있습니다. 함수를 사용하면 전역 네임 스페이스를 오염시켜야하며 한 번에 이러한 이름을 가진 하나의 상수 만 존재할 수 있습니다.

+0

전역 함수에서 같은 접두사를 함께 묶어 둘 수 있습니다. 그것은 당신이 제안하는 것과 같은 "다소"네임 스페이스입니다. 그냥 정적 클래스 함수는 꽤 제한되어 있기 때문에 당신은 정말 현명하게 그들을 사용해야합니다, 일반 MVC 패턴 IMHO를 사용하지 말아야합니다. – hakre

+0

정적 클래스 함수는 전역 함수를 논리적 인 장소로 분리하는 데 도움이되므로 훨씬 편리하며 모든 함수에 대해 하나의 거대한 파일을 가지거나 각 함수를 수동으로로드해야하는 것과 달리 함수와 전역 변수를 자동로드 할 수 있습니다. 파일. – Anther

0

투표가 끝나고 올바른 답변으로 표시된 첫 번째 답변을 이해하지 못했습니다. 여기 내 걸릴 걸립니다 :

정적 메서드는 전역 메서드와 비슷하지만 더 체계적으로 구성되어 네임 스페이스와 클래스 내에 포함됩니다. 그렇다고해서이 정의 때문에 객체보다 낫지는 않습니다. 그들은 그들의 사용법을 가지고있다. 특정 상태를 유지하는 클래스로 작업하는 경우 비 정적 클래스보다 적합합니다. 즉 인스턴스화하고 사용해야합니다. 그것이 상기 프로세스에서 특정 상태를 유지하지 않을 것이라면, 즉 파라미터를 수신하고 파라미터를 수신하고 정적 인 것으로 더 적합한 응답을 리턴한다.

이것은 static vs non-static에 대한 간단한보기입니다. 귀하의 경우 컨트롤러의 원활한 작동을 위해 다른 일이 필요할 수 있습니다.일반적으로 문제가되는 것은 인스턴스화하지 않는 정적 클래스에는 생성자가 없다는 것입니다. 이것은 부모가 생성자를 가지고 컨트롤러를 통해 사용하도록 설정된 객체를받는 경우 컨트롤러가 인스턴스화 될 수 있다고 생각하는 유일한 이유입니다. 나는 이것들이 단순하다면 당신이 정적 컨트롤러를 가지고 있다고 생각한다.

방금 ​​기능이 있거나 수업을 갖는 것과 관련하여 궁금한 점이 있으십니까? 클래스는 논리를 하나의 단위로 캡슐화합니다. 이것은 단순히이 그룹에 속한 것이 무엇이든이 유닛에 엄격히 속하는 정적 인 방법입니다. 우리는 평범한 기능을 사용하던 세상에서 왔지만 대개는 아주 빨리 변형됩니다. 소프트웨어 엔트로피를 보아도, 그 일이 거의 멈추지 않습니다. 클래스는 포함 된 것에 대한 참조이므로, 사람들은 그것을 사용합니다. 10 개의 파일을 필요로하는 이미지를 만들 수 있습니다. 그런 다음 갑자기 함수에 대한 필요성이 생기면 dev는 그것에 대해 많이 생각하지 않고 가장 가까운 파일 중 하나에 파일을 추가하고 그 모든 파일을 포함 시켜서 작동합니다. 클래스를 사용하는 반면, 클래스를 어디에 두어야하는지 생각해야합니다. 잘못된 위치에 배치하면 devs는 전역 적으로 사용할 수 없기 때문에 놓칠 수 있습니다.

희망이 도움이됩니다.

관련 문제