Komische Eigenschaft des eigenen Errorhandlings

meilon

Erfahrenes Mitglied
Hallo,
ich schreibe gerade eine eigene Klasse. Jetzt wollte ich das Errorhandling selber gestalten.

Hier mal ein wenig Code, um es verständlicher zu machen:
PHP:
<?php 
error_reporting(E_ALL);
class MyError {
	var $errorPages;
	
	function MyError() {
		$this->errorPages = array();		
	}
	
	function doError() {
		$ergebnis = 100/0;
	}
	
	function doAnotherError() {
		trigger_error('laa');
	}
	
	function addError($errormsg) {
		$this->errorPages[] = $errormsg;
		var_dump($this->errorPages);
	}
	
	function myErrorHandle($errno, $error, $filename, $line) {
		$this->addError($errno.": ".$error);
	}
	
}

$errorclass = new MyError();
$old_error_handler = set_error_handler(array($errorclass, 'myErrorHandle'));
$errorclass->doError();
$errorclass->addError('direct error 1');
$errorclass->doAnotherError();
$errorclass->addError('direct error 2');

echo "\r\nDas, was ich nur bekommen kann:\r\n";
var_dump($errorclass->errorPages);
?>
Das Ergebnis:
Code:
array(1) {
  [0]=>
  string(19) "2: Division by zero"
}
array(1) {
  [0]=>
  string(14) "direct error 1"
}
array(2) {
  [0]=>
  string(19) "2: Division by zero"
  [1]=>
  string(9) "1024: laa"
}
array(2) {
  [0]=>
  string(14) "direct error 1"
  [1]=>
  string(14) "direct error 2"
}

Das, was ich nur bekommen kann:
array(2) {
  [0]=>
  string(14) "direct error 1"
  [1]=>
  string(14) "direct error 2"
}
Wie komme ich nun auch an die Fehler, die mir der Errorhandler in $errorPages reinchreiben sollte

mfg
meilon
 
Hallo,

mit dieser Zeile…
PHP:
$old_error_handler = set_error_handler(array($errorclass, 'myErrorHandle'));
…wird eine Kopie des Objektes $errorclass erzeugt. An diese Kopie schickt PHP dann auch die Fehlermeldungen, und nicht an das eigentliche Objekt. Übergibst du allerdings eine Referenz auf $errorclass, sollte das erwartete Verhalten eintreten:
PHP:
$old_error_handler = set_error_handler(array(&$errorclass, 'myErrorHandle'));

Grüße,
Matthias
 
Ich möchte etwas ähnliches machen. Ich habe eine Klasse und in der möchte ich den error handler setzen...

PHP:
class Arena_Logger {
	/**
	 * doc doc doc
	 */
	function __constructor() {
		//code code code
		$errorclass = new Error_Hanlder(); 
		$old_error_handler = set_error_handler(array(&$errorclass, 'errorLogger'));
	}

	//code code code
}

Nun noch den Error Hanlder
PHP:
<?php
class Error_Hanlder{
	private $_logger;

	function __constructor($logger) {
		$this->_logger = $logger;
	}

	function errorLogger($code, $message, $file, $line){
		switch ($code) {
			case E_WARNING:
			case E_USER_WARNING:
				$priority = PEAR_LOG_WARNING;
				break;
			case E_NOTICE:
			case E_USER_NOTICE:
				$priority = PEAR_LOG_NOTICE;
				break;
			case E_ERROR:
			case E_USER_ERROR:
				$priority = PEAR_LOG_ERR;
				break;
			default:
				$priotity = PEAR_LOG_INFO;
		}
		echo "error handled<br />";
		$this->_logger->log($message . ' in ' . $file . ' at line ' . $line, $priority);
	}
}
?>

Nun, wenn ich die beiden Zeilen nicht in der Klasse schreibe, sondern ausserhalb funktioniert es. Wenn ich es jedoch versuche im Konstruktor zu setzen werden die Fehler nicht vom Error Handler übernommen. Was kann man da dagegen machen?

Natürlich motzt der Error Handler das er die funktion log() nicht kennt. Muss ich noch machen...

MFG
X
 
Zuletzt bearbeitet:
Ok, ok ok ok. Mein Fehler. *rofl* es heisst nicht __constructor sondern __construct. Sorry Leute...

Gruss
X
 
Zurück