2013-04-10 4 views
1

클래스를 부모 클래스로 캐스트 할 방법을 찾고 있습니다. 상황 :PHP에서 수퍼 클래스로 변환

DateTime 개체의 저글링을 줄이기 위해 __toString 메서드가 포함되도록 DateTime 클래스를 확장했습니다. 이 아름답게 작동하지만

class myDateTime extends DateTime{ 
public $formatstring = null; 

public function format($format = null) { 
    if(null === $format){ 
     $format = $this->formatstring; 
    } 
    if(null === $format){ 
     $format = 'Y-m-d H:i:s'; 
    } 

    return parent::format($format); 
} 

public function __toString(){ 
    return $this->format(); 
} 

} 

, 나는 나중에 내가 들어오는 objectDateTime 것으로 확인되었다고 가정하고 DateTime::diff을 깨는 발견했다.

public function TotalTime(){ 
    $start = $this->getStart(); 
    $end = $this->getEnd(); 
    $diff = $end->diff($start); 

    $minutes = 
     ($diff->days*1440) + 
     ($diff->h * 60) + 
     ($diff->i * 1) + 
     ($diff->s/60); 

    echo("<pre>Start:$start\nEnd:$end\nMin:$minutes\n</pre>"); 
    var_dump($diff); 

    return $minutes; 
} 

결과 DateInterval에는 항상 모든 값이 0으로 지정됩니다.

상속 된 클래스의 유형 변환을 수행하는 가장 효율적인 방법에 대한 제안 사항이 있습니까? PHP 5.4

편집 : 이것은 환경에 따라 좌우되는 것으로 보입니다. 현재이 문제는 Windows/PHP에서만 발생합니다.

PHP 5.4.10 (cli) (built: Dec 19 2012 20:33:35) 
Copyright (c) 1997-2012 The PHP Group 
Zend Engine v2.4.0, Copyright (c) 1998-2012 Zend Technologies 
+0

PHP에서 객체를 캐스팅 할 수 없음 – zerkms

+0

"나중에 깨지는 것을 발견했습니다"--- 어떤 특별한 방법으로? – zerkms

+1

클래스에 하나의 매개 변수로 정적'diff' 메소드를 추가하고 그것을 호출합니다 :'myDateTime :: diff', 클래스의 데이터를'DateTime' 객체로 변환하고'DateTime :: diff'를 호출하거나 코드를 구현하십시오. – mkjasinski

답변

0

때로는 질문에 대답하기 만하면됩니다.

우리가 캐스팅 할 수 없으므로 새 개체를 만들어야합니다. DateTime 객체보다 상속을 확인하는 것이 좋습니다 (무언가를 수정하는 경우 원본 문제보다 더 잘 수정하십시오). 이 방법은 부모의 메소드를 오버라이드 (override) :

public function diff($object,$absolute=false){ 
    if($object instanceof DateTime){ 
     $object = new DateTime($object); 
    } 
    return parent::diff($object,$absolute); 
} 

이 이제까지 날짜 시간에서 inheritted 과거에 무엇이든, 이것은 다른 사람이 myDateTime에서 상속한다면이 작업을 계속 할 수 있는지 확인하기 위해 상속 트리를 확인합니다.

+1

대신 "DateTime"을 찾고있는 것처럼 보입니다. if (in_array ('DateTime', class_parents ($ object))) {'->'instanceof'? – zerkms

+0

@zerkms : 예, 제안 사항을 반영하도록 편집하십시오. (내가 할 수있는 것을 찾아 보았습니다. :) –

+0

이 기능을 사용하지 않아도이 데모를 볼 수 있습니다 : http://codepad.viper-7.com/izOh5p – nickb

관련 문제