[Typo3-german] Problem und Debug-Meldung bei Mehrfachvererbung einer Basisklasse
Kussmann, Juergen
j.kussmann at t-online.net
Tue Nov 8 12:05:35 CET 2005
Hallo Liste,
Ich hatte gestern einen Bug, der mich relativ lange beschäftigt hatte. Im Endeffekt lag der Bug darin dass eine Basisklasse zweimal (von je einer Extension) erweitert wurde, obwohl dies nicht zulässig ist (jede Basisklasse darf nur einmal erweitert werden; dies ist ein Design-Fehler von Typo3), ich dies nicht wusste und beide Erweiterungen (der Basisklasse) sich im Wege standen...auf diesen Fehler muss man erstmal kommen :-(
Damit mir dies nicht noch einmal passiert, habe ich folgende zwei Funktionen der Klasse 'class.t3lib_div.php' (welche für's instanzieren von Objekten zuständig sind) umgeschrieben. Wenn man nun im Installations-Script das Debuging einschaltet, so erhält man eine Fehlermeldung, wenn eine Basisklasse zwei- oder mehrfach erweitert wird.
Hier der von mir geänderte Code:
/**
* Make instance of class
* Takes the class-extensions API of TYPO3 into account
* Please USE THIS instead of the PHP "new" keyword. Eg. "$obj = new myclass;" should be "$obj = t3lib_div::makeInstance("myclass")" instead!
* Usage: 447
*
* @param string Class name to instantiate
* @return object The object
*/
function &makeInstance($className) {
if($GLOBALS['TYPO3_CONF_VARS']['FE']['debug']) {
/* Update: Find all extensions which extends a basic-class */
if(class_exists('ux_'.$className)) {
$extMatch = array('name' => array(),
'path' => array());
$command = 'grep -r "class ux_'.$className.' extends '.$className.'" '.str_replace('index.php','',$_SERVER['SCRIPT_FILENAME']).'*';
exec($command,$output,$error);
if(!$error) {
for($i=0;$i<count($output);$i++) {
preg_match('/(.*?)\/([^\/]*?)\/[^\/]*?ux_'.$className.'/i',$output[$i],$match);
if(isset($match[2]) && stristr($GLOBALS['TYPO3_CONF_VARS']['EXT']['extList'],$match[2]) && !in_array($match[2],$extMatch['name'])) {
$extMatch['name'][] = $match[2];
$extMatch['path'][] = $match[1];
}
}
}
if(count($extMatch['name']) > 1) {
debug($extMatch,"These extensions extends the class '$className' (This message was generated in class t3lib_div::makeInstance)",__FILE__,__LINE__);
}
return t3lib_div::makeInstance('ux_'.$className);
} else {
return new $className;
}
} else {
# Original Code
return class_exists('ux_'.$className) ? t3lib_div::makeInstance('ux_'.$className) : new $className;
}
}
/**
* Return classname for new instance
* Takes the class-extensions API of TYPO3 into account
* Usage: 17
*
* @param string Base Class name to evaluate
* @return string Final class name to instantiate with "new [classname]"
*/
function makeInstanceClassName($className) {
if($GLOBALS['TYPO3_CONF_VARS']['FE']['debug']) {
/* Update: Find all extensions which extends a basic-class */
if(class_exists('ux_'.$className)) {
$extMatch = array('name' => array(),
'path' => array());
$command = 'grep -r "class ux_'.$className.' extends '.$className.'" '.str_replace('index.php','',$_SERVER['SCRIPT_FILENAME']).'*';
exec($command,$output,$error);
if(!$error) {
for($i=0;$i<count($output);$i++) {
preg_match('/(.*?)\/([^\/]*?)\/[^\/]*?ux_'.$className.'/i',$output[$i],$match);
if(isset($match[2]) && stristr($GLOBALS['TYPO3_CONF_VARS']['EXT']['extList'],$match[2]) && !in_array($match[2],$extMatch['name'])) {
$extMatch['name'][] = $match[2];
$extMatch['path'][] = $match[1];
}
}
}
if(count($extMatch['name']) > 1) {
debug($extMatch,"These extensions extends the class '$className' (This message was generated in class t3lib_div::makeInstanceClassName)",__FILE__,__LINE__);
}
return t3lib_div::makeInstanceClassName('ux_'.$className);
} else {
return $className;
}
} else {
# Original Code
return class_exists('ux_'.$className) ? t3lib_div::makeInstanceClassName('ux_'.$className) : $className;
}
}
Was haltet ihr von meiner Erweiterung?
Im Endeffekt wird (wenn das debuging eingeschaltet ist) nach erweiterten Klassen gesucht (per grep-Befehl). Werden mindestens zwei solcher Klassen gefunden (welche auch in der typo3-Instanz aktiviert sind) so wird eine Debug-Meldung generiert (mit den Pfaden zu den entsprechenden Extensions).
Viele Grüsse,
Jürgen Kußmann
More information about the TYPO3-german
mailing list