2012-05-12 12 views
1

다음의 간단한 클래스 생성자를 고려하십시오. (I 분명히 참조하는 모든 방법을 포함하고 있지 않다 있습니다생성자에서 값을 반환하는 것이 좋지 않습니까?

// Initialize User class. 
public function __construct($user_id = NULL) 
{ 
    // If user is loaded (and a user ID is provided) 
    if ($user_id) 
    { 
     // If user is authorized. 
     if ($this->authorized($user_id)) 
     { 
      // Load user information. 
      $this->info = $this->load($user_id); 
     } 
     else 
     { 
      // Return an empty (nonexistent) user. 
      return NULL; 
     } 
    } 

    // If user is loaded (and no user ID is provided) 
    else 
    { 
     // Create a new user. 
     $new_user = create_user(); 

     // Return the new user's ID. 
     return $new_user; 
    } 
} 

내 질문이 것은 :. 여기에 잘못된 값을 반환하는 내 방법 내 친구가 생성자는 항상 상관없이 객체를 반환해야한다고 주장한다?. 그러나 내가 여기에 제시된 방식은 훨씬 간단 해 보이며 작업하기가 훨씬 쉽습니다. (새로운 사용자를 만들면 그의 ID를 박쥐에서 바로 얻을 수 있습니다. 기존 사용자를로드하는 경우 즉시 그녀에게 접근 왜 나쁜?

+1

"항상, 아무리 ..." – Jon

+1

PHP에서는 반환 값이 적용되지 않습니다. http://stackoverflow.com/questions/2214724/php-constructor-to-return-a-null –

+2

친구의 조언은 아마도 다른 언어에서 온 것입니다. –

답변

8

당신이 작동하지 않습니다 간단하게하려고 노력하고, 생성자 당신이 null을 반환하려고해도, 어쨌든 User의 새 인스턴스를 반환합니다 . 예를 들어

,이 :

class User { 
    function __construct() { 
    return null; 
    } 
} 
var_dump(new User()); 

인쇄됩니다

object(User)#1 (0) { 
} 

http://codepad.org/0IdJydkY

+0

개체는이 시점에서 이미 생성되었으며'__construct()'는 생성시 개체의 속성을 수정하기위한 것입니다. 'new'에서 호출되면,이 생성자의 반환 값은 무시됩니다. 그러나 OP의 경우'$ new_user' 값을 반환하는'$ obj -> __ construct ($ user_id)'를 할 수 있습니다. 하지만'$ obj -> __ construct ($ user_id)'를 시도하는 것은 좋지 않습니다. 아주 나쁘다. 절대로 생성자 메서드를 직접 호출하지 마십시오. –

+0

@ bob-the-destroyer 나는'$ obj -> __ construct ($ user_id)'를 직접 사용하지 않을 생각이었다. 매우, 정말로 나쁜! 우선,'__construct'는 (이미'new ClassName()'에서 한번 실행 되었기 때문에),'__construct'는 두번째로 실행될 것입니다. – bfavaretto

+0

오른쪽. 일반적으로 클래스 외부에서 PHP "마법 메서드"를 호출 할 수 있지만 일반적으로 사용되거나 생산성이 떨어집니다. "반 패턴"보다 더 나쁩니다. OP의 경우, 이것은 매우 "잘못"입니다. OP에 대한 더 나은 해결책은 객체 또는 null을 반환하는 처리기/래퍼 함수를 ​​호출하는 것입니다. –

0

귀하의 __construct() 함수 shouldn 인 이유?/자신의 정보)

잘못 인 경우를 가지고 어떤 값이라도 반환하지 않으면 항상 자동으로 객체를 반환합니다. 특정 작업을 시작하는 데 사용해야합니다.

코드를 다른 기능에 넣는 것이 좋습니다. 이에

여기 읽을 수 있습니다 : Echo Return construct method;

2

당신은 사용자를 만들려면 클래스에 정적 메서드를 추가 할 수 있습니다 또는 null

을 반환
public static function createUser() { 
    // do your checks 
    // if valid return instance 
    // return null; 
} 

$user = User::createUser(); 

참고 : authorized() 메소드를 정적으로 만들어야 할 수도 있습니다. 나머지 클래스에 따라 달라집니다.

+1

패턴 팩토리, 맞습니까? 나는 그것이 맞다라고 생각한다 –

관련 문제