[php] PHP에서 객체를 인스턴스화하고 같은 줄에서 메소드를 호출 할 수 있습니까?

내가하고 싶은 것은 다음과 같습니다.

$method_result = new Obj()->method();

하지 말고 :

$obj = new Obj();
$method_result = $obj->method();

특정 상황에서는 결과가 실제로 중요하지 않습니다. 그러나 이것을 할 수있는 방법이 있습니까?



답변

요청한 기능은 PHP 5.4에서 사용할 수 있습니다. 다음은 PHP 5.4의 새로운 기능 목록입니다.

http://php.net/manual/en/migration54.new-features.php

그리고 새로운 기능 목록에서 관련 부분 :

인스턴스화에 대한 클래스 멤버 액세스가 추가되었습니다 ( 예 : (new Foo)-> bar ()).


답변

당신이 원하는 것을 할 수는 없습니다. 그러나 PHP에서 클래스와 동일한 이름을 가진 함수를 가질 수 있다는 사실을 사용하여 “속임수”를 사용할 수 있습니다. 그 이름은 충돌하지 않습니다.

따라서 다음과 같이 클래스를 선언하면 :

class Test {
    public function __construct($param) {
        $this->_var = $param;
    }
    public function myMethod() {
        return $this->_var * 2;
    }
    protected $_var;
}

그런 다음 해당 클래스의 인스턴스를 반환하고 클래스와 정확히 동일한 이름을 가진 함수를 선언 할 수 있습니다.

function Test($param) {
    return new Test($param);
}

이제는 요청 한대로 하나의 라이너를 사용할 수 있습니다. 단지 함수를 호출하는 것만이므로 new를 사용하지 않아도됩니다.

$a = Test(10)->myMethod();
var_dump($a);

그리고 그것은 작동합니다 : 여기, 나는 얻고 있습니다 :

int 20

출력으로.

그리고 더 나은 것은 함수에 phpdoc을 넣을 수 있다는 것입니다.

/**
 * @return Test
 */
function Test($param) {
    return new Test($param);
}

이런 식으로 IDE에 힌트를 얻을 수 있습니다. 적어도 Eclipse PDT 2.x에서는; screeshot 참조 :



편집 2010-11-30 : 며칠 전에 새로운 RFC가 제출되어 향후 PHP 버전 중 하나에이 기능을 추가 할 것을 제안합니다.

참조 : 의견 요청 : 인스턴스 및 메소드 호출 / 프로퍼티 액세스

따라서 PHP 5.4 또는 다른 향후 버전에서 이와 같은 작업을 수행 할 수 있습니다.

(new foo())->bar()
(new $foo())->bar
(new $bar->y)->x
(new foo)[0]


답변

아이디 함수를 정의하여보다 보편적으로 수행 할 수 있습니다.

function identity($x) {
    return $x;
}

identity(new Obj)->method();

그렇게하면 각 클래스에 대한 함수를 정의 할 필요가 없습니다.


답변

어때요?

$obj = new Obj(); $method_result = $obj->method(); // ?

:피


답변

아니요, 불가능합니다.
메소드를 호출하기 전에 인스턴스를 변수에 지정해야합니다.

정말로 이것을 원하지 않으면 ropstah가 제안한 것처럼 공장을 사용할 수 있습니다.

class ObjFactory{
  public static function newObj(){
      return new Obj();
  }
}
ObjFactory::newObj()->method();


답변

정적 팩토리 메소드를 사용하여 오브젝트를 생성 할 수 있습니다.

ObjectFactory::NewObj()->method();


답변

나도 한 형식에서 다른 형식으로 날짜를 변환하는 단일 표현식의 일부로 이것을 달성하기 위해 하나의 라이너를 찾고있었습니다. 단일 논리 연산이기 때문에 단일 코드 행 에서이 작업을 수행하는 것이 좋습니다. 따라서 이것은 약간 비밀 스럽지만 한 줄 내에서 날짜 객체를 인스턴스화하고 사용할 수 있습니다.

$newDateString = ($d = new DateTime('2011-08-30') ? $d->format('F d, Y') : '');

날짜 문자열을 한 형식에서 다른 형식으로 변환하는 또 다른 방법은 도우미 함수를 사용하여 코드의 OO 부분을 관리하는 것입니다.

function convertDate($oldDateString,$newDateFormatString) {
    $d = new DateTime($oldDateString);
    return $d->format($newDateFormatString);
}

$myNewDate = convertDate($myOldDate,'F d, Y');

객체 지향 접근 방식이 멋지고 필요하다고 생각하지만 때로는 간단한 작업을 수행하기에는 너무 많은 단계가 필요하므로 지루할 수 있습니다.