2010-02-07 1 views
4

에 메소드를 호출하는?PHP 구문은 첫번째 변수에 객체를 할당하도록 강요받지 않고 <strong>일시적으로 선언 된 객체</strong>의 메소드를 호출 할 수있는 방법이 있나요 임시 개체

은 아래를 참조하십시오 :

class Test 
{ 
    private $i = 7;  
    public function get() {return $this->i;} 
} 

$temp = new Test(); 
echo $temp->get(); //ok 

echo new Test()->get(); //invalid syntax 
echo {new Test()}->get(); //invalid syntax 
echo ${new Test()}->get(); //invalid syntax 

답변

7

나는 다음과 같은 해결 방법을 사용합니다.

나는 (글로벌 범위)이 함수를 선언 :

다음
function take($that) { return $that; } 

내가이 방법을 사용

echo take(new Test())->get(); 
3

불행하게도, 당신은 할 수 없습니다. PHP와 같은 방식 일뿐입니다.

1

불가능 왜 당신은 모든 객체이 방법을 만들까요?

개체의 요점은 고유 상태를 캡슐화하는 것입니다. 당신이 준 예에서, $i는 항상 7 일, 그래서 다음 개체를 만드는 그것에서 $i을 받고 다음 $i가 반환 된 후 객체에 대한 참조가 없기 때문에 가비지 컬렉터에 개체를 잃고 아무 문제가 없다. 다른 곳에서 볼 수 있듯이 정적 클래스는이 목적을 위해 훨씬 더 의미가 있습니다. 또는 폐쇄.

관련 주제 :이

+0

@stereofrog Andrew Gutmans가 Zend Technologies의 창립자 인 이유는 그가 그 이유를 알고 있다고 믿고 있습니다. – Gordon

+0

@stereofrog 글쎄, 핵심 커뮤니티에 속해 있지 않습니다. Andi의 진술에 의심을 품기위한 PHP의 내부 동작에 대한 충분한 통찰력이 없습니다. 그리고''(new foo) -> bar()'가 정적 메서드 나 클로저보다 어떤 이점을 더할 지 아직 보지 못했습니다. – Gordon

+0

@stereofrog 금지! = 소개되지 않았습니다. 그것은 주목할만한 차이입니다. 개인적으로, 나는이 표기법에 부가 가치가 보이지 않습니다. 물론, 덜 장황하지만 읽기 쉽지 않습니다. '$ a = 새로운 Foo; $ b = $ a-> bar(); $ c = $ b [25]; $ c ('blah');는 같은 결과를 얻을 것입니다. 이 점에서 PHP가 더 이상 완벽하게 만들지는 못합니다. 당신은'클래스 A {public function b ($ c) {return strtoupper ($ c); }} $ a = array (create_function ('', 'return new A;')); $ a [0]() -> b ('foo');'모든 비용으로 가독성을 망칠 경우. – Gordon

3

번호는 PHP의 파서의 제한 사항입니다.

class Test 
{ 
    private static $i = 7;  
    public static function get() {return self::$i;} 
} 

$value = Test::get(); 
7

는이 작업을 수행하지 왜

class Test 
{ 
    private $i = 7;  
    public function get() {return $this->i;} 

    public static function getNew() { return new self(); } 
} 

echo Test::getNew()->get(); 
+0

self() 함수 란 무엇입니까? 그것은 PHP에서 문서화되지 않았습니다. 당신은 {return new Test(); } –

+1

self() 함수가 아니라 자기 클래스의 인스턴스를 생성하고 있습니다.'new self()'는 여기에서'new Test()'와 동의어이며, 변경할 필요가 없다는 추가적인 보너스가 있습니다 테스트 클래스의 이름을 OldTest로 바꾼다. –

+0

@Krelin : cool, 나는 자기가 클래스 내의 static vars/methods를 호출하는 키워드 일 뿐이라고 생각했다. :) –

4

입니다.

+0

내 의견으로는 의미가있는 유일한 이유이기 때문에 +1. – Gordon

+0

나는 정적 인 키워드를 추가했다. 그러나 나는 그것을 도울 수 없다. 그러나 이런 식으로 수업을 사용하면 항상 나를 조금 불편하게 느낀다. 적절한 방식으로 사용하지 않는 느낌입니다. 게다가 클래스의 두 번째 인스턴스가 $ i에 대해 다른 값을 저장할 필요가있을 수 있기 때문에 OP가 원했던 것이 아닐 수도 있습니다 (간결하게하기 위해 파트를 떠난 경우). –

+0

미안하지만 나는 정말로 당신의 대답을 이해하지 못한다. 그러나 당신이 3 표를 얻었 기 때문에 나는 무엇이 실종되었는지 궁금해한다. 나는 정적 $ i를 원하지 않는다. 게다가 당신은 클래스가 객체가 아니라 변수를 returing하고있다. –

1

내가 종종 이것은 PHP가 내부에 아주 최근에 와서 불행하게도 일부 영향력있는 사람들이있다

function make($klass) { 
    $_ = func_get_args(); 
    if(count($_) < 2) 
     return new $klass; 
    $c = new ReflectionClass($klass); 
    return $c->newInstanceArgs(array_slice($_, 1)); 
} 

사용

make('SomeCLass')->method(); 

또는

make('SomeClass', arg1, arg2)->foobar(); 
+0

+1 영리한 물건. 조금 복잡해. –

1

이 작고 편리한 기능을 사용 (예 : 스나이퍼)가 PHP oppose the feature을 개발 중입니다. 전자 메일을 [email protected]에 보내십시오. 여러분이 어른 프로그래머임을 알리십시오. 나는이 동작을 할 때

+0

일부 기존 코드는 2x2 == 5에 의존 할 수 있으므로 수용해야합니다. – JAL

0

이 오래된 질문 : 난 그냥 업데이트 된 답을 제공하고있어 .(2012 년 5.4.0 이후) PHP 지원되는 모든 버전의

당신은이 작업을 수행 할 수 있습니다

(new Test())->get(); 

https://secure.php.net/manual/en/migration54.new-features.php를 참조하십시오 ("인스턴스에 클래스 멤버 액세스").

관련 문제