Raketenwissenschaftler: DateTime::createFromFormat (Vollständig, mit str_replace)

Beitrag lesen

Es bleibt hier noch zu erwähnen, dass hier noch keinerlei Datenkontrolle und Fehlerbehandlung durchgeführt wurde, die man selbstverständlich in einem Produktivmodul benötigen würde! :-)

Ich bin mir nur nicht ganz sicher, ob man das Beginnern so anbieten sollte, denn "Hilfe zur Selbsthilfe" heisst ja nicht, dass man die Hilfesuchenden verschreckt und für die anderen die eigentliche Hilfe in 100 Zeilen versteckt. (Für "maximal verschreckt" hätte ich jetzt noch Kommentare eingefügt, die Klasse isoliert und einen Unit-Test via Shell-Batch gebaut mit dem ich auch mehrere fatale Fehler abfangen und zeigen kann.

<?php
class date_create_from_german_d_M_Y {

    private static $defaultErrorType = E_USER_NOTICE;
	private static $search  = ['Mär', 'Mai', 'Okt', 'Dez'];
	private static $replace = ['Mar', 'May', 'Oct', 'Dec'];

	function __construct( $string = FALSE, $errorType = '' ) {
		if ( $string ) return getDateObject( $string, $this->userErrorType );
	}
	
	public function getDateObject ( $string, $errorType = FALSE ) {
		if ( FALSE === $errorType ) { 
			$errorType = self::$defaultErrorType;
		} else {
			self::checkErrorType( $errorType );
		}
						
		$d = date_create_from_format(
			'j-M-Y',
			str_replace( self::$search, self::$replace, $string )
		);
		if ( false === $d ) {
			self::onError( $string, $errorType );
			return FALSE;
		}
		return $d;
	}
	
	private function onError( $string, $errorType = '' ) {
		if ( '' === $errorType ) $errorType = self::$defaultErrorType;
		trigger_error( __class__ . ':' . __function__ . ':'. " input '$string' is not definied.", $errorType );
	}
	
	private function checkErrorType ( $errorType ) {
		if ( in_array ($errorType, [ E_USER_NOTICE, E_USER_WARNING, E_USER_ERROR ] ) ) {
			return true;
		} else {
			trigger_error( __class__ . ':' . __function__ . ':'. " Der Errortype darf nur [ E_USER_NOTICE, E_USER_WARNING, E_USER_ERROR ] sein. Gesetzt wurde '$errorType'", E_USER_ERROR );
		}
	}
	
}
echo '---------------------------' .  PHP_EOL;
echo 'TESTS:' .  PHP_EOL;

$dates = [
'28-Jan-2019',
'28-Feb-2019',
'28-Mär-2019',
'28-Apr-2019',
'28-Mai-2019',
'28-Jun-2019',
'28-Jul-2019',
'28-Aug-2019',
'28-Sep-2019',
'28-Okt-2019',
'28-Nov-2019',
'28-Dec-2019'
];

echo '---------------------------' .  PHP_EOL;
echo 'Direkte Benutzung der Klasse' .  PHP_EOL;
echo 'Erwartet: Fehlerfreie Ausgaben:' .  PHP_EOL;
echo '---------------------------' .  PHP_EOL;
foreach ( $dates as $date ) {
	$date = date_create_from_german_d_M_Y::getDateObject( $date );
	echo $date->format('Y-m-d') . PHP_EOL;
}

echo '---------------------------' .  PHP_EOL;
echo "Benutzung eines Objektes ( WOHL schneller bei Massendaten )" .  PHP_EOL;
echo "Erwartet: Fehlerfreie Ausgaben:" .  PHP_EOL;
echo '---------------------------' .  PHP_EOL;
$object = new date_create_from_german_d_M_Y();
foreach ( $dates as $date ) {
	$date = $object -> getDateObject( $date );
	echo $date->format('Y-m-d') . PHP_EOL;
}

echo '---------------------------' .  PHP_EOL;
echo "Erwartet: Fehler (Notiz):" .  PHP_EOL;
echo '---------------------------' .  PHP_EOL;
echo date_create_from_german_d_M_Y::getDateObject( '28-FOO-2019' ) .  PHP_EOL;

echo '---------------------------' .  PHP_EOL;
echo "Erwartet: Fehler (Notiz):" .  PHP_EOL;
echo '---------------------------' .  PHP_EOL;
echo date_create_from_german_d_M_Y::getDateObject( '28-FOO-2019', E_USER_NOTICE ) .  PHP_EOL;

/*
echo '---------------------------' .  PHP_EOL;
echo "Erwartet: Fehler (Fatal):" .  PHP_EOL;
echo '---------------------------' .  PHP_EOL;
echo date_create_from_german_d_M_Y::getDateObject( '28-FOO-2019', E_USER_ERROR ) .  PHP_EOL;
#*/

echo '---------------------------' .  PHP_EOL;
echo "Erwartet: Fehler (Fatal):" .  PHP_EOL;
echo '---------------------------' .  PHP_EOL;
echo date_create_from_german_d_M_Y::getDateObject( '28-FOO-2019', FALSCHER_WERT ) .  PHP_EOL;