내가하고 싶은 것은 다음과 같습니다.
$method_result = new Obj()->method();
하지 말고 :
$obj = new Obj();
$method_result = $obj->method();
특정 상황에서는 결과가 실제로 중요하지 않습니다. 그러나 이것을 할 수있는 방법이 있습니까?
my_method
대신 선언되어야 하는지 고려할 가치가 있습니다 static
.
내가하고 싶은 것은 다음과 같습니다.
$method_result = new Obj()->method();
하지 말고 :
$obj = new Obj();
$method_result = $obj->method();
특정 상황에서는 결과가 실제로 중요하지 않습니다. 그러나 이것을 할 수있는 방법이 있습니까?
my_method
대신 선언되어야 하는지 고려할 가치가 있습니다 static
.
답변:
요청한 기능은 PHP 5.4에서 사용할 수 있습니다. 다음은 PHP 5.4의 새로운 기능 목록입니다.
http://php.net/manual/en/migration54.new-features.php
그리고 새로운 기능 목록에서 관련 부분 :
인스턴스화에 대한 클래스 멤버 액세스가 추가되었습니다 ( 예 : (new Foo)-> bar ()).
(new Foo)->property
.
(new Foo)->property
는 어디에도 저장되지 않기 때문에 객체가 더 이상 존재하지 않기 때문에 저장할 값이 없습니다.
return $this
. setter 에 추가 하기 만하면 됩니다. 또한 세터를 연결할 수 있습니다.
당신이 원하는 것을 할 수는 없습니다. 그러나 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]
아니요, 불가능합니다.
메소드를 호출하기 전에 인스턴스를 변수에 지정해야합니다.
정말로 이것을 원하지 않으면 ropstah가 제안한 것처럼 공장을 사용할 수 있습니다.
class ObjFactory{
public static function newObj(){
return new Obj();
}
}
ObjFactory::newObj()->method();
public static function
대신에 사용하도록 강요합니다 public function
. 정적 사용을 권장합니까?
나도 한 형식에서 다른 형식으로 날짜를 변환하는 단일 표현식의 일부로 이것을 달성하기 위해 하나의 라이너를 찾고있었습니다. 단일 논리 연산이기 때문에 단일 코드 행 에서이 작업을 수행하는 것이 좋습니다. 따라서 이것은 약간 비밀 스럽지만 한 줄 내에서 날짜 객체를 인스턴스화하고 사용할 수 있습니다.
$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 () 명령으로 전송 된 "new"명령인지, 그리고 __call ()의 작동 방식으로 인해 다른 명령을 사용할 수도 있습니다.