php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger > PHP Tipps 2008

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 31.10.2008, 10:55  
Neuer Benutzer
 
Registriert seit: 30.10.2008
Beiträge: 6
unimow befindet sich auf einem aufstrebenden Ast
Standard [Erledigt] autoload lädt nicht alle Klassendateien

Hallo,

ich versuche mit der Funktion __autoload() alle verwendeten Klassen laden zu lassen. Jetzt beobachte ich das Phänomen, dass die Funktion nicht immer aufgerufen wird. Ich sehe aber keinen Grund dafür.

Hier der aufgerufene Code
Code:
//require_once 'classes/Mail.php';
//require_once 'classes/MailGateway.php';

	function __autoload($name){
		$classpath = 'classes/'.$name.'.php';
		echo($classpath." exists? ".file_exists($classpath)."<br/>");
		if(file_exists($classpath)){
			echo("loading ".$classpath."<br/><br/>");
			require_once $classpath;
		}else{
			echo("File ".$classpath." does not exist.");
		}
	}

class sendEcard {
	
	function __construct($var){
		
		try{
			$reg = new RegisterUserData($var);
			
			$um = new UserMail($reg->getEcardId());
			//echo($mail->getHtmlBody());
			$gate = new MailGateway();
			$gate->addMail($um);
			$gate->processMails();
			
			echo("success=1");
		}catch(Exception $e){
			echo("success=0".$e->getMessage());
		}
	}
}

$sendEcard = new SendEcard($_REQUEST);
Ich habe ein paar Ausgaben in die Autoload-Funktion eingebaut, um festzustelle, ob diese ausgeführt wird.
Hier die Ausgabe
Code:
classes/RegisterUserData.php exists? 1
loading classes/RegisterUserData.php

classes/URL.php exists? 1
loading classes/URL.php

classes/UserMail.php exists? 1
loading classes/UserMail.php

classes/Mail.php exists? 1
loading classes/Mail.php

classes/Inxmail_Connection.php exists? 1
loading classes/Inxmail_Connection.php


Fatal error: Class 'MailGateway' not found in /kunden/127589_60329/subdomains/demo/timo/sendEcard.php5 on line 34
Aus irgendeinem Grund wird für MailGateway autoload nicht aufgerufen.
Wenn ich require_once direkt angebe und den auskommentierten Code oben verwende, dann funktioniert alles einwandfrei.
Dieses Verhalten macht die autoload-Funktion für mich nicht verwendbar, wenn das tatsächlich kein Fehler von mir ist.

Das ganze läuft auf einem Linuxserver mit PHP 5.2.6.

Gibt es dafür eine Erklärung?
Viele Grüße
unimow ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 31.10.2008, 12:04  
Erfahrener Benutzer
 
Registriert seit: 27.09.2008
Beiträge: 316
PHP-Kenntnisse:
Fortgeschritten
moveax1 befindet sich auf einem aufstrebenden Ast
Standard

In der Klasse sendEcard instanzierst du die MailGateway Klassen, aber in der Ausgabe des autoloaders ist die Klasse nicht enthalten wird diese auch includiert?
moveax1 ist offline  
Alt 31.10.2008, 14:20  
Erfahrener Benutzer
 
Registriert seit: 16.07.2005
Beiträge: 1.007
PHP-Kenntnisse:
Fortgeschritten
brian johnson befindet sich auf einem aufstrebenden Ast
Standard

die implementierung von autoload soll alle klassen laden, sonst wärs, wie du selbst sagt, ja sinnlos.

kommentier doch erstmal das heir aus, und schaue obs dann läuft:

PHP-Code:
$gate = new MailGateway();
            
$gate->addMail($um);
            
$gate->processMails(); 
wenn das klappt, haben wir ein problem.

außerdem kannst du noch folgendes probieren:

PHP-Code:
<?php
    
function __autoload($name){
        
        eval(
'class '.$name.' { }');
    }

class 
sendEcard {
    
    function 
__construct($var){
        
        try{
            
//$reg = new RegisterUserData($var);
            
            
$um = new UserMail($reg->getEcardId());
            
//echo($mail->getHtmlBody());
            
$gate = new MailGateway();
            
//$gate->addMail($um);
            //$gate->processMails();
            
            
echo("success=1");
        }catch(
Exception $e){
            echo(
"success=0".$e->getMessage());
        }
    }
}

$sendEcard = new SendEcard($_REQUEST);
__________________
PHP4?!?>>>Aktuelle PHP Version: 5.2.11 || 5.3.0
Suse 11.2 *vorfreude*
brian johnson ist offline  
Alt 31.10.2008, 14:23  
Benutzer
 
Registriert seit: 19.10.2008
Beiträge: 44
tohms befindet sich auf einem aufstrebenden Ast
Standard

Die __autoload()-Methode funktioniert immer. Wenn dann ist der Fehler innerhalb der __autoload-Methode. Wie sieht die Klasse MailGateway aus?

Geändert von tohms (31.10.2008 um 14:28 Uhr).
tohms ist offline  
Alt 31.10.2008, 18:10  
Neuer Benutzer
 
Registriert seit: 30.10.2008
Beiträge: 6
unimow befindet sich auf einem aufstrebenden Ast
Standard

Ich habe etwas herausgefunden.
Nachdem ich die Variante ausprobiert habe, die brian vorgeschlagen hat - und die übrigens auch funktioniert - habe ich etwas anderes versucht.

Ich verwende noch eine API eines Drittanbieters, die ich in einer Klasse anspreche, die ich vor einiger Zeit in einem anderen Projekt verwendet habe. Dort gab es keine Probleme, deshalb bin ich nicht gleich darauf gekommen, aber diese API besitzt eine eigene Autoloader-Funktion.
Diese scheint mit meiner zu kollidieren.

Ich kann allerdings nicht nachvollziehen, wieso.
Hier ist mal der Code der anderen Autoloader-Funktion.

Für mich ist der Fall aber damit erstmal klar.
Ich werde mir eine eigene Autoload-Funktion schreiben.
Danke an alle.

Code:
class Inx_Apiimpl_Loader {
	
	private static $_path = null;
	
	public static function registerAutoload() {
		$sCurrPath = get_include_path();
		$sAppendDir = PATH_SEPARATOR . dirname(dirname(__FILE__) );
		if (strpos($sCurrPath, $sAppendDir) === false)
	        set_include_path($sCurrPath . $sAppendDir);
	    $aSplFunctions = spl_autoload_functions();    
	    
		if (
		    function_exists('__autoload') 
		    && (
		        false === $aSplFunctions 
		        || !in_array('__autoload', $aSplFunctions))
		    ) {
			spl_autoload_register('__autoload');
		}
		
		if (false === $aSplFunctions || !in_array('inx_autoload', $aSplFunctions))
		    spl_autoload_register('inx_autoload');
	}
}

function inx_autoload($sClasseName) {
	
	$inx_path = dirname(dirname(__FILE__));
	
	$arr = explode('_', $sClasseName);
	$filename = array_pop($arr) . '.php';
	$dirname='';
	foreach ($arr as $i=>$dir) {
		if ($i!==0) {
			$dirname .= $dir . DIRECTORY_SEPARATOR;
		}
	}
	
	$path = $inx_path . DIRECTORY_SEPARATOR . $dirname . $filename;

	if (file_exists($path)) {
		require_once $path;
	}
}
unimow ist offline  
Alt 31.10.2008, 18:49  
Erfahrener Benutzer
 
Registriert seit: 16.07.2005
Beiträge: 1.007
PHP-Kenntnisse:
Fortgeschritten
brian johnson befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von unimow Beitrag anzeigen
Ich habe etwas herausgefunden.
Nachdem ich die Variante ausprobiert habe, die brian vorgeschlagen hat - und die übrigens auch funktioniert - habe ich etwas anderes versucht.

Ich verwende noch eine API eines Drittanbieters, die ich in einer Klasse anspreche, die ich vor einiger Zeit in einem anderen Projekt verwendet habe. Dort gab es keine Probleme, deshalb bin ich nicht gleich darauf gekommen, aber diese API besitzt eine eigene Autoloader-Funktion.
Diese scheint mit meiner zu kollidieren.

Ich kann allerdings nicht nachvollziehen, wieso.
Hier ist mal der Code der anderen Autoloader-Funktion.

Für mich ist der Fall aber damit erstmal klar.
Ich werde mir eine eigene Autoload-Funktion schreiben.
Danke an alle.

Code:
class Inx_Apiimpl_Loader {
    
    private static $_path = null;
    
    public static function registerAutoload() {
        $sCurrPath = get_include_path();
        $sAppendDir = PATH_SEPARATOR . dirname(dirname(__FILE__) );
        if (strpos($sCurrPath, $sAppendDir) === false)
            set_include_path($sCurrPath . $sAppendDir);
        $aSplFunctions = spl_autoload_functions();    
        
        if (
            function_exists('__autoload') 
            && (
                false === $aSplFunctions 
                || !in_array('__autoload', $aSplFunctions))
            ) {
            spl_autoload_register('__autoload');
        }
        
        if (false === $aSplFunctions || !in_array('inx_autoload', $aSplFunctions))
            spl_autoload_register('inx_autoload');
    }
}

function inx_autoload($sClasseName) {
    
    $inx_path = dirname(dirname(__FILE__));
    
    $arr = explode('_', $sClasseName);
    $filename = array_pop($arr) . '.php';
    $dirname='';
    foreach ($arr as $i=>$dir) {
        if ($i!==0) {
            $dirname .= $dir . DIRECTORY_SEPARATOR;
        }
    }
    
    $path = $inx_path . DIRECTORY_SEPARATOR . $dirname . $filename;

    if (file_exists($path)) {
        require_once $path;
    }
}
hi,

verwende dann spl_autoload_register(). so ist es möglich mehrere autoload funktionen zu benutzen. allerdings, wie ich bemerkte, mit der einschränkung das die funktionen in der reihenfolge in der sie definiert wurden aufgerufen werden. man müsste sich um das umzukehren alle spl_autoload_funktionen mit spl_autoload_function zurückgeben lassen und umgekehrt wieder registirieren...
__________________
PHP4?!?>>>Aktuelle PHP Version: 5.2.11 || 5.3.0
Suse 11.2 *vorfreude*
brian johnson ist offline  
Alt 31.10.2008, 21:24  
Neuer Benutzer
 
Registriert seit: 30.10.2008
Beiträge: 6
unimow befindet sich auf einem aufstrebenden Ast
Standard

Danke.
Das werde ich machen.
unimow ist offline  
 


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Javascript: neues Fenster lädt ewig ZeHa HTML, Usability und Barrierefreiheit 5 24.12.2007 14:19
Firefox lädt AJAX nur IE nicht Mikay Kun HTML, Usability und Barrierefreiheit 7 29.11.2007 15:04
Seite lädt unendlich im IE suter HTML, Usability und Barrierefreiheit 7 08.08.2006 13:59
MySQL lädt immer nur 127 Datensätze einer CSV-Datei Klaus Datenbanken 4 15.11.2005 16:40
Seite lädt nicht Smiley PHP Tipps 2007 6 04.11.2005 19:30
Wartezeit, während seite lädt PHP Tipps 2005-2 4 26.10.2005 14:26
header download lädt mp3 als text ins browserfenster PHP-Fortgeschrittene 12 19.08.2005 17:22
Ladefenster während Seite lädt yoshy HTML, Usability und Barrierefreiheit 5 01.08.2005 23:29
Lädt Bilder nicht... Beitragsarchiv 8 31.07.2005 13:40
php lädt seite doppelt phpwiki PHP Tipps 2005 3 07.05.2005 12:29
[Erledigt] time() lädt nicht neu... PHP-Fortgeschrittene 16 18.03.2005 20:41
[Erledigt] Login-Seite lädt nicht (imo P3P-Fehler) PHP-Fortgeschrittene 2 07.02.2005 13:04
Mcryp Bibliothek lädt nicht PHP Tipps 2004-2 8 05.12.2004 20:34
Seite lädt nicht rocco PHP Tipps 2004-2 4 07.11.2004 21:16
Seite lädt und llädt und lädt .... PHP Tipps 2004 3 24.09.2004 12:23

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
php lädt nicht alle klassen, inx_apiimpl_loader::registerautoload();, php __autoload wird nicht aufgerufen, autoload funktion?, spl_autoload_register reihenfolge, php __autoload function, autoload funktion php, php mehrere autoload, php5 function autoload funktioniert nicht, php autload bei funktionen, php __autoload lädt, php autoloader reihenfolge, php autoload lädt nicht, spl_autoload_register php 5.2 läd klassen nicht, \opensuse 11.2\ \mail.php\, autoload php funktioniert nicht, autoload php, autoload static classes wont work, opensuse 11.2 \mail.php\, php autoload static class

Alle Zeitangaben in WEZ +1. Es ist jetzt 19:10 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum