2013-04-10 24 views
1

我正在尋找一種將類轉換爲其父類的方法。情況:在PHP中轉換爲超類php

爲了減少與DateTime對象的雜耍,我擴展了DateTime類以包含__toString方法。

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(); 
} 

} 

雖然這工作很漂亮,我後來發現它是打破DateTime::diff,這我假設是檢查傳入objectDateTime

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總是將每個值都歸零。

對最有效的方式來做一個繼承類的類型轉換的任何建議? 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 2013-04-10 00:33:10

+0

中投射對象「我後來發現它正在破壞」 - 以什麼特殊方式? – zerkms 2013-04-10 00:33:45

+1

將一個參數的靜態'diff'方法添加到您的類,並調用:'myDateTime :: diff',將您的數據在類中轉換爲'DateTime'對象並調用'DateTime :: diff'或實現您的代碼。 – mkjasinski 2013-04-10 00:40:22

回答

0

有時你只需要問這個問題來回答它。

因此,既然我們不能施放,我們將不得不創建一個新的對象。我們只需要確保檢查繼承比DateTime對象更好(如果您正在修復某些內容,請修復它比原始問題更好)。此方法重寫父類的方法:

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

這將檢查繼承樹,看看是否從日期時間永遠繼承了過去的任何東西,這將允許其繼續工作,如果別人是從myDateTime繼承。

+1

」if(in_array('DateTime',class_parents($ object))){' - >'instanceof'? – zerkms 2013-04-10 00:52:48

+0

@zerkms:是的,編輯以反映建議。 (我甚至尋找的東西會這樣做:) – 2013-04-10 01:12:28

+0

你不需要這個功能,使其工作,只是看到這個演示:http://codepad.viper-7.com/izOh5p – nickb 2013-04-10 01:21:20