Problem mit FUnktionen aus Klasse aufrufen

Kalma

Erfahrenes Mitglied
Hi,

ich schreibe grad eine Klasse, die die Benutzerdaten ausliest, formatiert und zurückgibt.

Ich habe Funktionen zu jedem Detail in der Klasse, so z.b.:
nickname
vorname
nachname
geschlecht
email
zusatz_email
homepage

und so weiter.
Allerdings habe ich das Problem, wenn ich jetzt zum Beispiel nur die Funktionen nickname(); geschlecht(); und homepage(); haben will, es nicht funktioniert.

Dies liegt wahrscheinlich am Aufrufen der nächsten Funktion, da meine Funktionen so aussehen.
PHP:
function nickname()
{
// Inhalt

// nächste funktion
$this->vorname();
}
Das ruft ja immer die Funktion auf, die danach kommt.


Wie krieg ich das nun hin, dass die Funktion die ich will, auch aufgerufen wird, ohne dass ich alle durchgehen muss?
Hoffe ihr versteht was ich meine und bedanke mich im vorraus!!
 
Du könntest dafür die __toString()-Methode verwenden, die jedes Mal dann aufgerufen wird, wenn ein Objekt der Klasse zu einer Zeichenkette konvertiert werden soll:
PHP:
function __toString()
{
	$retVal  = $this->nickname();
	$retVal .= $this->vorname();
	// …
	return $retVal;
}
PHP:
echo $object;
Dazu müssten die Werte allerdings als Rückgabewerte zurück- und nicht direkt ausgegeben werden.
 
Ist sehr lang, un dnoch ohne prüfungen und so:

PHP:
<?php
	// Klasse zum Auslesen der BenutzerDetails anhand der ID
	class BenutzerDetails
    {
    	var $benutzerid;
		
		var $nickname;
		var $geburtstag;
		var $anrede;
		var $vorname;
		var $nachname;
		var $namenszusatz;
		var $titel;
		var $strasse;
		var $hausnummer;
		var $plz;
		var $wohnort;
		var $bundesland;
		var $adresse;
		var $telefon;
		var $fax;
		var $handy;
		var $homepage;
		var $email;
		var $ersatz_email;
		var $msn;
		var $skype;
		var $beruf;
		var $info;
		var $interessen;
		var $treffen;
		var $online;
		var $stimmung;
		var $letzter_login;
		var $registriert;
        
        function BenutzerDetails($id)
        {
        	$query		=	'SELECT
								*
							FROM
								benutzer
							WHERE	
								`benutzer_id` = "'.$id.'"
							LIMIT
								1';
			$result		=	@mysql_query($query);
			$select		=	mysql_fetch_array($result);
					
			
			$this->nickname			= $select['benutzer_nickname'];
			$this->geburtstag		= $select['benutzer_geburtstag'];
			$this->anrede			= $select['benutzer_anrede'];
			$this->vorname			= $select['benutzer_vorname'];
			$this->nachname			= $select['benutzer_nachname'];
			$this->namenszusatz		= $select['benutzer_namenszusatz'];
			$this->titel			= $select['benutzer_titel'];
			$this->geschlecht		= $select['benutzer_geschlecht'];
			$this->strasse			= $select['benutzer_strasse'];
			$this->hausnummer		= $select['benutzer_hausnummer'];
			$this->plz				= $select['benutzer_plz'];
			$this->wohnort			= $select['benutzer_wohnort'];
			$this->bundesland		= $select['benutzer_bundesland'];
			$this->telefon			= $select['benutzer_telefon'];
			$this->dienst_telefon	= $select['benutzer_dienst_telefon'];
			$this->fax				= $select['benutzer_fax'];
			$this->handy			= $select['benutzer_handy'];
			$this->homepage			= $select['benutzer_homepage'];
			$this->email			= $select['benutzer_email'];
			$this->ersatz_email		= $select['benutzer_ersatz_email'];
			$this->msn				= $select['benutzer_msn'];
			$this->skype			= $select['benutzer_skype'];
			$this->beruf			= $select['benutzer_beruf'];
			$this->info				= $select['benutzer_info'];
			$this->interessen		= $select['benutzer_interessen'];
			$this->treffen			= $select['benutzer_treffen'];
			$this->online			= $select['benutzer_online'];
			$this->stimmung			= $select['benutzer_stimmung'];
			$this->letzter_login	= $select['benutzer_letzter_login'];
			$this->registriert		= $select['benutzer_registriert'];
			
			// Weiter
			$this->nickname();
        }

		function nickname()
		{
			return $this->nickname;
			
			// Weiter
			$this->geburtstag();
		}
		
		function geburtstag()
		{
			return $this->geburtstag;
			
			// Weiter
			$this->anrede();
		}

		function anrede()
		{
			return $this->anrede;
			
			$this->vorname();
		}
		
		function vorname()
		{
			return $this->vorname;
		
			$this->nachname();
		}
		
		function namenszusatz()
		{
			return $this->namenszusatz;
			
			$this->titel();
		}
		
		function titel()
		{
			return $this->geschlecht;
			
			$this->strasse();
		}
		
		function strasse()
		{
			return $this->strasse;
			
			$this->hausnummer();
		}
		
		function plz()
		{
			return $this->plz;
			
			$this->wohnort();
		}
		
		function bundesland()
		{
			return $this->bundesland;
			
			$this->telefon();
		}
		
		function telefon()
		{
			return $this->telefon;
			
			$this->dienst_telefon();
		}
		
		function dienst_telefon()
		{
			return $this->dienst_telefon;
			
			$this->fax();
		}
		
		function fax()
		{
			return $this->fax;
			
			$this->handy();
		}
		
		function handy()
		{
			return $this->handy;
			
			$this->homepage();
		}
		
		function homepage()
		{
			return $this->homepage;
			
			$this->email();
		}
		
		function email()
		{
			return $this->email;
			
			$this->ersatz_email();
		}
		
		function msn()
		{
			return $this->msn;
			
			$this->skype();
		}
		
		function skype()
		{
			return $this->skype;
			
			$this->beruf();
		}
		
		function beruf()
		{
			return $this->beruf;
		}
    }
?>
 
Hi,

also ich weiss ja nicht was du mit so einem Aufruf bezwecken willst. Aber das geht so nicht.
PHP:
function nickname() 
        { 
            return $this->nickname; 
             
            // Weiter 
            $this->geburtstag(); 
        }

Nach dem return wird nichts mehr ausgeführt!

Was soll denn nachher wenn du die Klasse aufrufst rauskommen?
 
Hö, echt nicht?
Also ich hab innem Tutorial mal gesehen, dass man das so macht.
Muss ich das einfach nur weglassen?


Ja, beim Aufruf kommt halt bei nickname(); der Benutzername des Benutzers raus..



Aber:
Das Problem ist ja jetzt eigentlich, dass ich nicht zur Funktion Homepage komme ohne die vorigen Funktionen aufzurufen...
 
Es ist sinnlos, für jedes Attribut eine eigene Methode zu nutzen, wenn doch sowieso immer alle Attribute auf einmal zurückgegeben werden sollen.
 
Ich versteh jetzt grade nicht ganz was du meinst.

Also klar, meistens wird alles aufgerufen, aber manchmal halt auch nur 3 (mehr oder weniger) Informationen, zum Beispiel
- nickname
- homepage
- email adresse

Und das geht nicht, ohne dass ich alle Funktionen aus der Klasse einmal aufrufe :confused:


Aber ich glaube wir reden aneinander vorbei..:rolleyes:
 
Du könntest eine Klasse schreiben, die die __call()-Methode nutzt (benötigt PHP 5), um nicht für jedes Attribut eine Getter- und Setter-Methode definieren zu müssen. Beispielsweise:
PHP:
class PropertyObject {

	private $properties;

	public function setProperty($property, $value)
	{
		$this->properties[$property] = $value;
	}

	public function getProperty($property)
	{
		return $this->properties[$property];
	}

	public function __call($method, $args)
	{
		if (!preg_match('/^(get|set)([A-Z].*)/', $method, $match) || $method[2] == 'Property') {
			throw new Exception("unknown method [$method]");
		}
		if ($match[1] == 'get') {
			if (count($args)!=0) {
				throw new Exception("invalid argument count");
			}
			return $this->getProperty(strtolower($match[2]{0}).substr($match[2], 1));
		}
		if ($match[1] == 'set') {
			if (count($args)!=1) {
				throw new Exception("invalid argument count");
			}
			return $this->setProperty(strtolower($match[2]{0}).substr($match[2], 1), array_pop($args));
		}
	}
}
Von dieser Klasse vererbst du dann die Merkmale an deine BenutzerDetails-Klasse:
PHP:
class BenutzerDetails extends PropertyObject
{
	function BenutzerDetails($id)
	{
		// …
		foreach ($select as $prop => $value) {
			$this->setProperty(substr($prop, 9), $value);
		}
	}
}
Dort kannst du sie dann wie folgt nutzen:
PHP:
$object = new BenutzerDetails(12345);
echo $object->getNickname();
Und um alle Ausprägungen zu erhalten, nutzt du einfach die [post=1630938]bereits erwähnte[/post] __toString()-Methode.
 
wenn php5 kannst du dir das auch einfacher machen...
PHP:
class BenutzerDetails{
 private $vorname;
 private $nachname;
 public function __get($name){
   if(isset($this->$name)){
      return $this->$name;
   }
   return false;
 }
 public function __set($name, $value){
   if(isset($this->$name)){
      $this->$name = $value;
   }
 }
}
 
Zurück