Newsgroup: it.comp.www.php
Titolo: Classi Extends

Sera a tutti,
Ho un problemino... Ho provato in tutte le maniere a capire da cosa sia
dovuto ma nada...
Ora ve lo illustro:
----------- core.php
class Core
{
   // serie di function
}
-----------
Questo è il file che crea la classe Core, dove verranno caricate tutte
le variabili e le funzioni principali per poter gestire il sito.
----------- db.php
class Database extends Core
{
   // serie di function quali connessione al db, gestione delle query,
modifiche risultati
}
-----------
----------- debug.php
class Debug extends Core
{
   // serie di function che gestiscono gli errori, l'output a video e
il log in file .log
}
-----------
Questo è un poche parole il mio Core.
Nella pagina index.php i 3 file verranno inclusi in ordine Core, Debug,
Database perchè nella classe Database verranno richiamate alcune
funzioni di Debug.
Ora il problema sta appunto in questo, con questo codice
------------ index.php
require("core.php"); require("debug.php"); require("db.php");
$core = new Core(); $debug = new Debug(); $db = new Database();
$db->Connect(); // Gestisce la connessione al db, seleziona il db
$db->Query("SELECT..."); // Effettua una query
------------
Nella funzione Query di Database c'è un check sulla corretta
esecuzione della query, se questa non andasse a buon fine richiama la
funzione writeLog di Debug.
Se con queste informazioni potete aiutarmi ok, altrimenti posso
pastarvi il codice delle classi.
Grazie per l'aiuto ^^

class Debug {
error_reporting  (E_ALL | E_ERROR | E_WARNING | E_PARSE);
set_error_handler("my_error_handler");
function my_error_handler( $errno, $errstr, $errfile, $errline )
{
	if ( ! error_reporting() )
	{
		return;
	}
	$errfile = str_replace( @getcwd(), "", $errfile );
	switch ($errno)
	{
  		case E_ERROR:
   			echo "<b>ERROR</b> [$errno] $errstr (Line: $errline of
$errfile)<br />\n";
   			exit(1);
   		break;
  		case E_WARNING:
  			echo "<b>WARNING</b> [$errno] $errstr (Line: $errline of
$errfile)<br />\n";
   		break;
 		default:
   			//Do nothing
   		break;
	}
}
}
Questo dovrebbe essere sufficiente...in caso di errore (dichiarato
all'inizio) il controllo viene passato a my_error_handler e gli fai fare
quello che vuoi...
Come mai Debug è una estensione di core??Non ne capisco il motivo...
phpWriter , in data 16/11/2006 19:23 :


Piso ha scritto:

Così facendo mi basta creare l'oggetto, e in modo autonomo verrà
richiamato ogni qual volta si presenti un'errore?

Se inizializzato ovviamente...
Comunque sì ogni volta la gestione errori verrà passata alla classe Debug
phpWriter , in data 18/11/2006 02:06 :


Piso ha scritto:

class Debug
{
	var $debug_var = array();
	function Debug( $load_var )
	{
		if ( !is_array( $load_var ) )
			die( "Debug var non lette" );
		$this->debug_var = $load_var;
		error_reporting(E_ALL | E_ERROR | E_WARNING | E_PARSE);
		set_error_handler("returnError");
	}
	function returnError( $errno , $errstr , $errfile , $errline )
	{
		if( ! error_reporting() )
		{
			return;
		}
		$errfile = str_replace( @getcwd(), "", $errfile );
		switch( $errno )
		{
			case E_ERROR:
				echo "<b>ERROR</b> [$errno] $errstr (Line: $errline of $errfile)<br
/>\n";
				exit(1);
			break;
			case E_WARNING:
				echo "<b>WARNING</b> [$errno] $errstr (Line: $errline of
$errfile)<br />\n";
			break;
			default:
			break;
		}
	}
}
Mi da questo errore:
Warning: set_error_handler() expects argument 1, 'returnError', to be a
valid callback in f:\www\mycore\libs\debug.php on line 16
La linea interessata è appunto quella che riguarda la funzione
set_error_handler();
Non capisco dove sia il problema :@

 valid callback in f:\www\mycore\libs\debug.php on line 16
non trova la funzione 'returnError', che quindi non e' una callback
valida
perche'?
perche' 'returnError' non e' una funzione, ma il metodo di una classe,
e per indicare a set_error_handler() di richiamare il metodo di una
classe con quel nome e non una funzione globale devi usare questa
sintassi (nel caso, come il tuo, che la chiamata venga fatta
dall'interno della classe inizializzata):
set_error_handler(array(&$this, 'returnError'));

T_PAAMAYIM_NEKUDOTAYM ha scritto:

Avevo trovato questa soluzione, ma non l'avevo utilizzata perchè mi
tornava strano il fatto di creare un'array per passare il nome di un
metodo.
Ti sarei grato se mi spiegassi anche questa soluzione:
array(&$this,"nome_func")
Grazie ^^