"Call to a member function on a non-object", obwohl es ein Objekt ist

Azi

Erfahrenes Mitglied
Hmm, ich habe noch nie mit Klassen programmiert, aber jetzt brauchte ich eine. Leider klappt das nicht so ganz, die Fehlermeldung lautet:
Code:
Fatal error: Call to a member function chdir() on a non-object in index.php on line 49

Hier der Code:
PHP:
  $connection=ftp_login(ftp_connect($_SERVER['SERVER_NAME'],$_SESSION['config']['user'],$_SESSION['config']['pass']));
  function dv_chdir($dv_dir)
  {
   ftp_chdir($connection,$dv_dir); //Zeile 49
  }

Weiß jemand, wie sich das beheben lässt?
 
PHP:
$connection=ftp_login(ftp_connect($_SERVER['SERVER_NAME'],$_SESSION['config']['user'],$_SESSION['config']['pass'])); 
function dv_chdir($dv_dir) 
    {
/*HIER*/
       global $connection;
/**/
        ftp_chdir($connection,$dv_dir); //Zeile 49 
    }

Daher kommt der Fehler, weil $connection dann nicht existiert(in der Funktion)
 
wenn du nun schon ne klasse benutzt, dann lös das problem doch mit nem konstruktor...

PHP:
<?php
class dv_ftp {

  var $connection;  // Verbindungskennung

  function dv_ftp($server,$user,$pass)  // Konstruktor (Verbindet automatisch)
  { 
   $this->connection=ftp_connect($server,$user,$pass) or die("Keine Verbindung zu FTP-Server m&ouml;glich!"); 
  }

  function dv_chdir($dv_dir) // Methode (neues Verzeichnis)
  { 
      return ftp_chdir($this->connection,$dv_dir);
  }
}
?>

so hast du bis jetzt erstmal nur definiert, welche Eigenschaften und welche Methoden ein Objekt dieser Klasse hat (Klasse = dv_ftp, Objekt = $dv_ftp_obj [weiter unten])...

nun erzeugen wir mal ein FTP-Objekt und rufen eine Methode dieses Objekts auf...

aufruf:

PHP:
<?php
$dv_ftp_obj = new dv_ftp($_SERVER['SERVER_NAME'],$_SESSION['config']['user'],$_SESSION['config']['pass']);
// Beim Erzeugen wird der Konstruktor gerufen und Verbindet zum FTP-Server

// $newDir <-- neues Verzeichnis
if(is_object($dv_ftp_obj))  // Nochmal prüfen ob wirklich ein Objekt erzeugt wurde...
{
    // ja = Befehle ausführen
    $dv_ftp_obj->dv_chdir($newDir);  // FTP-Objekt -> wechsle Verzeichnis
}
else
{
    // nein = Fehlermeldung
}
?>

so kannste dann auch ganz schnell neue Funktionen/Methoden für deine FTP-Klasse einbauen...

PS: Hier gibts auch irgendwo ne Anleitung wie man seine PHP4 Klassen zu PHP5 Klassen umbauen kann, hab jetzt keine Lust zu suchen, aber wenns dich interessiert :suchen:
(Hab hier mal PHP4 für die Klasse genommen weils auch unter PHP5 läuft aber andersrum nicht)
 
Zudem gibt es hier in der Tutorials Sektion eine gute FTP Klasse. Kannst du dir ja mal bei Gelegenheit anschauen. Dann brauchst du nicht extra eine eigene zu schreiben.
 
Genau diese FTP-Klasse benutze ich auch, nur bastel ich mir ein Skript, welche auch die PHP-FTP-Funktion sowie die PHP-Dateisystem-Funktionen benutzen kann. Ich definiere dann je nach eingestellter Zugriffsart dann Funktionen. Damit kann ich zum Beispiel immer mit dv_chdir das Verzeichnis wechseln, ich muss nicht für jede Zugriffsart eine if-Abfrage machen. Ich hoffe, ihr versteht, was ich meine ^^! Ein Datei-Verwaltungs-Skript mit mehreren Möglichkeiten, auf den Server zuzugreifen, klar?
 
Teh H4mst0R hat gesagt.:
PS: Hier gibts auch irgendwo ne Anleitung wie man seine PHP4 Klassen zu PHP5 Klassen umbauen kann, hab jetzt keine Lust zu suchen, aber wenns dich interessiert :suchen:
Nicht ganz, es ist in die andere Richtung, es geht darum PHP5-Klassen auf PHP4 zu portieren.
Aber im Grunde sollte man mit dem dort vermittelten Wissen auch in der Lage sein eine PHP4-Klasse so umzuschreiben, dass sie die netten Features des PHP5-OOP nutzt.
Hier ist die Anleitung.
Azi hat gesagt.:
Genau diese FTP-Klasse benutze ich auch, nur bastel ich mir ein Skript, welche auch die PHP-FTP-Funktion sowie die PHP-Dateisystem-Funktionen benutzen kann. Ich definiere dann je nach eingestellter Zugriffsart dann Funktionen.
Gute Idee, sowas nutze ich in meinem WebMailer auch. Es wird halt zuvor eingestellt ob ueber das Dateisystem oder mit FTP gearbeitet werden soll und dementsprechend werden dann Funktionen deklariert.
Hier mal ein kleines Beispiel:
PHP:
if (USEFTP==true)
	{
		if (function_exists('ftp_connect'))
			{
				function createtempdir()
				{
					$ftp=ftp_connect('localhost');
					if ($ftp==false)
						{
							return false;
						}
					if (ftp_login($ftp,FTPUSER,FTPPASS)==false)
						{
							ftp_close($ftp);
							return false;
						}
					if (ftp_pasv($ftp,true)==false)
						{
							ftp_close($ftp);
							return false;
						}
					if (FTPBASE!='')
						{
							if (ftp_chdir($ftp,FTPBASE)==false)
								{
									ftp_close($ftp);
									return false;
								}
						}
					if (ftp_mkdir($ftp,'mailtemp/'.session_id())==false)
						{
							ftp_close($ftp);
							return false;
						}
					ftp_close($ftp);
					return true;
				}
			}
		else
			{
				require_once('ftpconnection.class.php');
				function createtempdir()
				{
					$ftp=new ftpconnection('localhost',FTPUSER,FTPPASS);
					if (FTPBASE!='')
						{
							if ($ftp->chdir(FTPBASE)==false)
								{
									unset($ftp);
									return false;
								}
						}
					if ($ftp->mkdir('mailtemp/'.session_id())==false)
						{
							unset($ftp);
							return false;
						}
					unset($ftp);
					return true;
				}
			}
	}
else
	{
		function createtempdir()
		{
			mkdir('mailtemp/'.session_id());
		}
	}
Ich hab das ganze mal auf die Funktion createtempdir() reduziert, da das ganze sonst gut 300 Zeilen waeren.
Ich setzt auch GetText ein um die Moeglichkeit zu bieten mehrere Sprachen zu unterstuetzen. Da GetText ja auch nicht so haeufig anzutreffen ist hab ich einen kleinen Workaround um im Source meinen Text trotzdem immer mit gettext() ausgeben zu koennen.
PHP:
<?php
if (function_exists('gettext'))
	{
		setlocale(LC_MESSAGES,$lang);
		bindtextdomain('lang','translations');
		textdomain('lang');
	}
else
	{
		function gettext($string)
		{
			return $string;
		}
	}
?>
 
Zurück