PHP에서는 return self으로 정적 메서드를 연결할 수 없습니다. 이것은 체인이 매우 유용하고 인스턴스를 사용하여 메서드를 연결해야하기 때문에 정적 메서드의 사용을 제한합니다.PHP에서 self를 반환 할 수없는 이유는 무엇입니까?
PHP 개발자가 self
을 반환하지 않기로 결정한 이유가 있습니까? 또는 일반적으로 OOP에 self
을 반환 할 수 없습니까?
PHP에서는 return self으로 정적 메서드를 연결할 수 없습니다. 이것은 체인이 매우 유용하고 인스턴스를 사용하여 메서드를 연결해야하기 때문에 정적 메서드의 사용을 제한합니다.PHP에서 self를 반환 할 수없는 이유는 무엇입니까?
PHP 개발자가 self
을 반환하지 않기로 결정한 이유가 있습니까? 또는 일반적으로 OOP에 self
을 반환 할 수 없습니까?
당신과 아무 관계가없는 누군가가 너 자신을 포기하고 존재하지 않는 무언가로 돌아갈 것을 요구한다면 어떻게 느끼겠습니까?
다행스럽게도 PHP는 하루에 수 백만 번 'die()'를 들었 기 때문에 아무런 감정이 없습니다. – CodeCaster
하하 그렇습니다. 폭발도! – Luc
내가 알고있는 OOP 언어가 유형을 유형으로 반환 할 수 없기 때문에 '자기'를 반환 할 수 없습니다 (이를 바꾸는 방법을 모르겠 음). 그러나 누구나 인스턴스을 반환 할 수 있습니다. 정적 메서드는 클래스 정의의 일부이며 응용 프로그램이 실행되는 동안 호출 할 수 있습니다.
OOP를 할 때 정적 키워드를 매우 조심스럽게 사용해야합니다.이 키워드를 남용하기 쉽습니다. 메소드를 체인으로 연결하려면 객체를 사용하십시오. 정적 메서드는 상태가 필요하지 않고 함수가 단순히 입력을 처리하고 결과를 반환 할 때 만 사용해야합니다.
체인을 연결할 때 상태를 유지해야하며 정적 인 클래스/메소드를 사용하지 않아도됩니다. (일부 경우에는 예외가 있지만 예외이며 여기서는 그렇지 않습니다.)
파이썬이나 루비에서'return cls/self'는 클래스 메소드에서 잘 작동합니다. 왜냐하면 실제로 클래스는이 클래스와 다른 많은 언어의 최상위 클래스 객체이기 때문입니다. –
파이썬도 루비도 모른다. :) 그러나 정적 클래스를 그 자체로 반환하는 것은 여전히 이상한 일이며, 단지 몇 개의 문자를 입력하는 것을 절약 할 수 있습니다. – MikeSW
MikeSW : 그렇게하는 것이 합리적이라고 말하지는 않았지만 적어도 객체 기반 언어 (객체 기반은 모든 것이 객체를 포함하여 유형 포함)에서 가능해야합니다. –
이유가 없습니다. 구문 자체가 아닌이 지원되지 않습니다. 거의 PHP 5.3에서 일할 수 : PHP는 Foo::A()::B()
을 구문 분석 할 경우 작동 할
class Foo
{
public static function A()
{
return __CLASS__;
}
public static function B() { }
}
$chain = Foo::A();
$chain::B();
.
는 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
는 정직, 체인이로 남용되고 모두가 그쪽을 생각하기 때문에 가독성에 영향을 미치는 지점 깨끗한 읽을 수있는 코드의 목적은 가장 긴 체인을 가능하게하는 것입니다 (비슷한 방식으로 사람들은 중첩 된 삼원 항을 냉정하게 생각하는 데 사용했습니다). 어쨌든, 여기를 참조하십시오 http://stackoverflow.com/questions/125268/chaining-static-methods-in-php – scibuff
개인적인 취향의 문제라고 생각합니다. –
정적 메서드를 연결해야하는 경우 디자인 실수를 저질렀을 가능성이 큽니다. – Crozin