2012-06-09 6 views
3

OOP의 세계는 나에게 상당히 새로운 것이므로 나와 함께 맨발로하십시오.OOP 방법 연결 선택 반환

이 시점에서

,의 내가 수업과 같이 있다고 가정 해 봅시다 : 그래서 주어진 인터페이스가 나를 new Sentence을 만들 수있는 것입니다

class Sentence { 
    __construct($content) { 
    $this->content = $content; 
    } 
    public function grab_word($num) { 
    $words = explode(" ", $this->content); 
    return $words[$num+1]; 
    } 
} 

하고 난에서 단어를 가져 오도록 grab_word() 클래스 메소드를 호출 할 수 있습니다 문장 :

$sentence = new Sentence("Lorem ipsum dolor sit amet"); 
echo $sentence->grab_word(2); 

그러나, 내가 뭘하려는 다른 체인 클래스 메소드를 추가하는 저에게이 단어를 대문자로 할 수있는 기능을 제공합니다. 체인 연결 방법은 객체 상속을 필요로하기 때문에

$sentence->grab_word(2); # -> ipsum 
$sentence->grab_word(2)->caps(); # -> IPSUM 

분명이 작동하지 않습니다. 만약 내가 caps()을 만들고 그 함수를 연결했다면 반환 값이 상속 된 Sentence 객체가 아니기 때문에 에러를 반환 할 것입니다.

요약하면, 제 질문은 이러한 메서드를 선택적으로 연결하는 기능을 얻는 방법이지만, 필요에 따라 (예 : 출력 예제와 같이) 필요할 때마다 비 개체도 반환합니다.

+0

짧게 : 할 수 없습니다. Complex : 현재 변형 된 값을 가지고 다니기 위해 객체를 만들 수 있습니다. 그런 다음 필요하다면 그 객체를 암시 적으로 문자열로 변환하기 위해'__toString()'을 구현하십시오. 확실히 노력할 가치가 없습니다. – mario

답변

3

대체로 말해서, 당신이 요구하는 것은 불가능합니다. 항상 메서드 호출을 연결하는 데 필요한 객체를 항상 반환하지 않는 것이 어떻습니까? new Word($words[ ... ])을 반환하면 더 나은 위치에있게됩니다.

이제 "광범위하게 말하기"라고하면 다른 방법으로 다른 클래스에 살기 위해 할 수있는 일이 있습니다. __call()을 사용하여 루비 믹스와 비슷한 것을 구현할 수 있지만, 실제로는 꽤 열등합니다. 은 단순히 호출 된 메소드 이름을보고 가능한 대상 목록을 반복하여 해당 객체에 호출을 위임하거나 예외를 발생시키기 전에 해당 메소드에 응답하는지 확인합니다.

추신 :이 질문은 상속과 관련이 없습니다. 메서드 체이닝은 상속 계층을 구현하는 것이 아니라 객체를 반환해야합니다. 물론 $this을 반환 할 수도 있지만 일반적으로 다른 개체를 반환합니다.

+1

모든 답변을 선택할 수 있었으면 좋겠지 만 포괄적 인 설명을 먼저 제시 했으므로 귀하의 답변을 수락합니다. 통찰력/팁에 대해 너무 고마워! (나는 또한 모든 유용한 답변을 투표 중입니다.) –

4
class Sentence { 
    function __construct($content) { 
    $this->content = $content; 
    } 
    public function grab_word($num) { 
    $words = explode(" ", $this->content); 
    return new Sentence($words[$num+1]); 
    } 
    public function caps() { 
    return new Sentence(strtoupper($this->content)); 
    } 
    function __toString(){ 
     return $this->content; 
    } 
} 

__toString 메서드가있는 객체는 문자열과 완전히 호환되지 않습니다. 그것은 여전히 ​​객체이지만 문자열 컨텍스트에서 명시 적으로 사용될 때 문자열로 변환됩니다.

+0

또는 문장과 word.class.php를 모두 포함하도록 단어 클래스를 작성하십시오. 잘 코딩 된 문자열 클래스를 상속하므로 내장 메소드가 모든 문자열 반환에 사용될 수 있습니다 – IEnumerable

2

String을 객체로 취급하는 일부 언어에서는 상당히 논리적입니다. PHP는 Perl과 C에서 영감을 얻었으며, "string"은 객체가 아닙니다.

class Word { 
    private $content; 
    function __construct($content){ 
     $this->content=$content; 
    } 
    function __toString(){ 
     return $this->content; 
    } 
    function caps(){ 
     strtoupper($this->content); 
     return $this; 
    } 
} 

class Sentence { 
    function grab_word($num) 
     $words = explode(" ", $this->content); 
     return new Word($words[$num+1]); 
    } 
} 

그것은 당신에게 약간 다른 구현을 제공합니다로 또한 @ 크리스 의해 답변을 보라 :

귀하는 클래스로 캡슐화 개체 수 있습니다. 명시 적 복제 없이는 새 객체 인스턴스를 만들지 말라는 것이 좋습니다. 리소스 낭비이고 PHP의 디자인이 서버의 빠르고 정확한 응답에 초점을 맞추기 때문입니다.