source

PHP에서는 오브젝트를 인스턴스화하고 같은 회선상에서 메서드를 호출할 수 있습니까?

nicesource 2022. 12. 4. 22:32
반응형

PHP에서는 오브젝트를 인스턴스화하고 같은 회선상에서 메서드를 호출할 수 있습니까?

제가 하고 싶은 일은 다음과 같습니다.

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

다음 작업을 수행할 필요가 없습니다.

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

내 경우 결과는 사실 중요하지 않다.하지만, 이것을 할 수 있는 방법이 있을까요?

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

https://php-legacy-docs.zend.com/manual/php5/en/migration54.new-features

새로운 기능 리스트의 관련 부품:

인스턴스화에 대한 클래스 구성원 액세스가 추가되었습니다.(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);
}

이제 요청하신 대로 원라이너를 사용할 수 있게 되었습니다.단, 함수를 호출하고 있기 때문에 새로운 기능을 사용하지 않습니다.

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

그리고 효과가 있습니다.여기서, 나는 다음을 얻습니다.

int 20

출력으로 사용합니다.


기능에는 phpdoc을 붙일 수 있습니다.

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

이렇게 하면 적어도 Eclipse PDT 2.x에서는 IDE에 힌트도 얻을 수 있습니다.스크리샷을 참조해 주세요.



Edit 2010-11-30 : 참고로 며칠 전에 새로운 RFC가 제출되었습니다.이 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(); // ?

:P

아니, 이건 불가능해.
인스턴스의 메서드를 호출하려면 먼저 변수에 인스턴스를 할당해야 합니다.

이 작업을 수행하지 않으려면 ropstah가 제안하는 대로 공장을 사용할 수 있습니다.

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

간단하게 할 수 있습니다.

$method_result = (new Obj())->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');

오브젝트 지향의 어프로치는 쿨하고 필요하다고 생각합니다만, 심플한 조작을 실현하기 위해서 너무 많은 스텝이 필요하기 때문에 지루할 수 있습니다.

질문에는 꽤 오래된 내용이지만, 여기에 언급해야 할 사항이 있습니다.

"_call()"이라는 특수 클래스 메서드를 사용하여 클래스 내부에 새 항목을 만들 수 있습니다.다음과 같이 사용합니다.

<?php
class test
{

function __call($func,$args)
{
    echo "I am here - $func\n";
}

}

    $a = new test();
    $a->new( "My new class" );
?>

출력은 다음과 같습니다.

I am here - new

따라서 PHP를 속여 최상위 클래스(또는 실제 클래스) 내에서 "새로운" 명령어를 만들고 include 명령어를 __call() 함수에 넣어 원하는 클래스를 포함할 수 있습니다.물론 $func를 테스트하여 __call() 명령어로 전송된 새로운 명령어인지 확인하고 (물론) __call() 동작에 따라 다른 명령어를 사용할 수도 있습니다.

언급URL : https://stackoverflow.com/questions/1402505/in-php-can-you-instantiate-an-object-and-call-a-method-on-the-same-line

반응형