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
'source' 카테고리의 다른 글
함수를 정의하기 위한 const의 적절한 사용 (0) | 2022.12.04 |
---|---|
Java 오류: 비교 방법이 일반 계약을 위반합니다. (0) | 2022.12.04 |
rewriteBatchedStatements=true를 사용하는 MySQL 및 JDBC (0) | 2022.12.04 |
Node.js에서 로컬 IP 주소를 가져옵니다. (0) | 2022.12.04 |
를 「Atribute」에 할 수 ?를 「Atribute」에 할 수 ?를 「Atribute」에 할 수 ? (0) | 2022.12.04 |