2012-02-28 5 views
4

PHP에서는 return self으로 정적 메서드를 연결할 수 없습니다. 이것은 체인이 매우 유용하고 인스턴스를 사용하여 메서드를 연결해야하기 때문에 정적 메서드의 사용을 제한합니다.PHP에서 self를 반환 할 수없는 이유는 무엇입니까?

PHP 개발자가 self을 반환하지 않기로 결정한 이유가 있습니까? 또는 일반적으로 OOP에 self을 반환 할 수 없습니까?

+5

는 정직, 체인이로 남용되고 모두가 그쪽을 생각하기 때문에 가독성에 영향을 미치는 지점 깨끗한 읽을 수있는 코드의 목적은 가장 긴 체인을 가능하게하는 것입니다 (비슷한 방식으로 사람들은 중첩 된 삼원 항을 냉정하게 생각하는 데 사용했습니다). 어쨌든, 여기를 참조하십시오 http://stackoverflow.com/questions/125268/chaining-static-methods-in-php – scibuff

+0

개인적인 취향의 문제라고 생각합니다. –

+7

정적 메서드를 연결해야하는 경우 디자인 실수를 저질렀을 가능성이 큽니다. – Crozin

답변

1

당신과 아무 관계가없는 누군가가 너 자신을 포기하고 존재하지 않는 무언가로 돌아갈 것을 요구한다면 어떻게 느끼겠습니까?

+26

다행스럽게도 PHP는 하루에 수 백만 번 'die()'를 들었 기 때문에 아무런 감정이 없습니다. – CodeCaster

+6

하하 그렇습니다. 폭발도! – Luc

2

내가 알고있는 OOP 언어가 유형을 유형으로 반환 할 수 없기 때문에 '자기'를 반환 할 수 없습니다 (이를 바꾸는 방법을 모르겠 음). 그러나 누구나 인스턴스을 반환 할 수 있습니다. 정적 메서드는 클래스 정의의 일부이며 응용 프로그램이 실행되는 동안 호출 할 수 있습니다.

OOP를 할 때 정적 키워드를 매우 조심스럽게 사용해야합니다.이 키워드를 남용하기 쉽습니다. 메소드를 체인으로 연결하려면 객체를 사용하십시오. 정적 메서드는 상태가 필요하지 않고 함수가 단순히 입력을 처리하고 결과를 반환 할 때 만 사용해야합니다.

체인을 연결할 때 상태를 유지해야하며 정적 인 클래스/메소드를 사용하지 않아도됩니다. (일부 경우에는 예외가 있지만 예외이며 여기서는 그렇지 않습니다.)

+1

파이썬이나 루비에서'return cls/self'는 클래스 메소드에서 잘 작동합니다. 왜냐하면 실제로 클래스는이 클래스와 다른 많은 언어의 최상위 클래스 객체이기 때문입니다. –

+0

파이썬도 루비도 모른다. :) 그러나 정적 클래스를 그 자체로 반환하는 것은 여전히 ​​이상한 일이며, 단지 몇 개의 문자를 입력하는 것을 절약 할 수 있습니다. – MikeSW

+0

MikeSW : 그렇게하는 것이 합리적이라고 말하지는 않았지만 적어도 객체 기반 언어 (객체 기반은 모든 것이 객체를 포함하여 유형 포함)에서 가능해야합니다. –

3

이유가 없습니다. 구문 자체가 아닌이 지원되지 않습니다. 거의 PHP 5.3에서 일할 수 : PHP는 Foo::A()::B()을 구문 분석 할 경우 작동 할

class Foo 
{ 
    public static function A() 
    { 
    return __CLASS__; 
    } 

    public static function B() { } 
} 

$chain = Foo::A(); 
$chain::B(); 

.

0

return new static() 또는 return new self()을 시도

class Calculator 
{ 
    private static $_var = 0; 

    public static function startFrom($var) 
    { 
     self::$_var = $var; 
     return new static(); 
    } 

    public static function add($var) 
    { 
     self::$_var += $var; 
     return new static(); 
    } 

    public static function sub($var) 
    { 
     self::$_var -= $var; 
     return new static(); 
    } 

    public static function get() 
    { 
     return self::$_var; 
    } 
} 

이 연쇄 정지 방법이 사용될 수있다 :

echo Calculator::startFrom(10) 
    ->add(5) 
    ->sub(10) 
    ->get(); // return 5 

New self vs. new static

관련 문제