php.de

Zurück   php.de > Webentwicklung > PHP-Fortgeschrittene

PHP-Fortgeschrittene Arbeiten mit PHP ohne Einschränkungen

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 28.03.2006, 11:36  
Benutzer
 
Registriert seit: 21.01.2005
Beiträge: 34
FloMX
Standard Zugriff auf verschachteltes Objekt aus Funktion

Hi,

schwer einzuschätzen, ob das nun eine Anfänger oder Fortgeschrittenen Frage ist... nja.

Ich habe folgendes Problem:

Ich habe eine instanzierte Klasse und darin ein objekt.
Code:
<?php
function getB() {
// soll das Feld $wichtig aus Objekt $obj_b aus Objekt $obj_a holen.
// demnach will ich die folgende Ausgabe: "das hier will ich später haben"
}

class b {
var $wichtig;
function b($wichtig) {
$this->wichtig = $wichtig;
}
function getWichtig() {
return $this->wichtig;
}
}

class a {
var $obj_b;
function a() {
$this->obj_b = new b("das hier will ich später haben");
}
}

$obj_a = new a;
?>
Nun möchte ich auf das eingeschatelte Objekt mit der Funktion getB() zugreifen.

Im Moment habe ich das realisiert indem ich einfach eine Referenz des Objekts an die Funktion übergeben habe:
Code:
<?php
function getB(&$class_b) {
echo $class_b->getWichtig();
}

class b {
var $wichtig;
function b($wichtig) {
$this->wichtig = $wichtig;
}
function getWichtig() {
return $this->wichtig;
}
}

class a {
var $obj_b;
function a() {
$this->obj_b = new b("das hier will ich später haben");
getB($this->obj_b);
}
}

$obj_a = new a;
?>
Allerdings habe ich mir sagen lassen, dass Referenzen nicht immer die beste Lösung sind...
gibt es hierzu Alternativen?
Mit get_class_vars() hats leider nicht geklappt...

Gruß Flo!

Ps: kann sein, dass in dem oberen Code noch'n paar Fehler stecken, aber ich denke es ist soweit verständlich.
__________________
Die schönsten Formulierungen sind üblicherweise auch die einfachsten. ADAM SMITH
FloMX ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

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

Alt 28.03.2006, 11:48  
Erfahrener Benutzer
 
Registriert seit: 21.12.2004
Beiträge: 4.651
PHP-Kenntnisse:
Fortgeschritten
mepeisen ist ein Lichtblickmepeisen ist ein Lichtblickmepeisen ist ein Lichtblickmepeisen ist ein Lichtblickmepeisen ist ein Lichtblickmepeisen ist ein Lichtblick
mepeisen eine Nachricht über ICQ schicken mepeisen eine Nachricht über Skype™ schicken
Standard

Warum gibt es in der Klasse b keine Methode "getWichtig()"? Wenn du ein fortgeschrittener bist, wirst du deine Gründe haben, wenn nicht, ist das eine AnfängerFrage und die Beantwortung der Frage zugleich die "Lösung".

Zu den Referenzen:
Es gibt andere Möglichkeiten. Bei Verwendung von PHP5 können Referenzen wegfallen, bei Verwendung von PHP4 sollten Referenzen genutzt werden, um das "Kopier-Feature" zu umgehen
__________________
Entwickler aus Leidenschaft und ein Zahnrad in einem der größten Java-Projekte der Welt.
mepeisen ist offline   Mit Zitat antworten
Alt 28.03.2006, 11:54  
Benutzer
 
Registriert seit: 21.01.2005
Beiträge: 34
FloMX
Standard

Zitat:
Warum gibt es in der Klasse b keine Methode "getWichtig()"? Wenn du ein fortgeschrittener bist, wirst du deine Gründe haben, wenn nicht, ist das eine AnfängerFrage und die Beantwortung der Frage zugleich die "Lösung".
sorry,
hab mich vertan, ich meinte nat. $obj_b->getWichtig()!

Zitat:
Zu den Referenzen:
Es gibt andere Möglichkeiten. Bei Verwendung von PHP5 können Referenzen wegfallen, bei Verwendung von PHP4 sollten Referenzen genutzt werden, um das "Kopier-Feature" zu umgehen
Meine Lösung basiert auf Php4, da es ein Projekt für Webserver ist, soll es auch auf nicht Php5 Servern lauffähig sein.
In diesem Falle werde ich wohl bei meiner Lösung bleiben,
danke dir!
__________________
Die schönsten Formulierungen sind üblicherweise auch die einfachsten. ADAM SMITH
FloMX ist offline   Mit Zitat antworten
Alt 28.03.2006, 11:57  
Erfahrener Benutzer
 
Registriert seit: 21.12.2004
Beiträge: 4.651
PHP-Kenntnisse:
Fortgeschritten
mepeisen ist ein Lichtblickmepeisen ist ein Lichtblickmepeisen ist ein Lichtblickmepeisen ist ein Lichtblickmepeisen ist ein Lichtblickmepeisen ist ein Lichtblick
mepeisen eine Nachricht über ICQ schicken mepeisen eine Nachricht über Skype™ schicken
Standard

Es ist eben nicht irrelevant. Ich meine, dass du "getB()" komplett streichst und stattdessen $obj_b->getWichtig() aufrufst. Der Umweg über eine Funktion "getB()" zeigt von Design-Schwächen und ist eigentlich in 98% der Fälle überflüssig. Es gibt Gründe, wo sowas Sinn machen kann, aber bisher hast du keinen davon genannt
__________________
Entwickler aus Leidenschaft und ein Zahnrad in einem der größten Java-Projekte der Welt.
mepeisen ist offline   Mit Zitat antworten
Alt 28.03.2006, 13:00  
Erfahrener Benutzer
 
Registriert seit: 18.07.2004
Beiträge: 2.162
PHP-Kenntnisse:
Fortgeschritten
Basti
Standard

Wer braucht denn dieses $B->getWichtig()? Und kennt dieser Client die Instanz von B überhaupt? Und, wenn er $B kennt (sonst könnte er $B ja nicht als Parameter an getB() übergeben), warum dann überhaupt getB() und nicht gleich $B->getWichtig() (siehe "mepeisen")?

Soll A B nur erzeugen oder soll A die Zugriffe auf B steuern, kapseln, wrappen? Wenn von X aus auf B zugegriffen werden soll - unabhängig von A - dann lass A B erzeugen und an X zurückgeben (return new B. Dann kann X direkt auf $B->getWichtig() zugreigen. Soll X aber garnichts von B wissen, z.B. weil B austauschbar sein soll und nur A was mit B zu schaffen haben soll, dann biete eine Methode A::getWichtig() an (return $this->B->getWichtig().

Vielleicht ist es auch gut, dein konkretes Problem zu schildern und nicht nur abstarkte As und Bs ohne Kontext.

Basti
Basti ist offline   Mit Zitat antworten
Alt 28.03.2006, 15:03  
Benutzer
 
Registriert seit: 21.01.2005
Beiträge: 34
FloMX
Standard

Zitat:
Es ist eben nicht irrelevant. Ich meine, dass du "getB()" komplett streichst und stattdessen $obj_b->getWichtig() aufrufst. Der Umweg über eine Funktion "getB()" zeigt von Design-Schwächen und ist eigentlich in 98% der Fälle überflüssig. Es gibt Gründe, wo sowas Sinn machen kann, aber bisher hast du keinen davon genannt Wink
Ah, ok, in diesem Fall hättest du recht, leider muss ich den Umweg über die Funktion nehmen...

Zitat:
Vielleicht ist es auch gut, dein konkretes Problem zu schildern und nicht nur abstarkte As und Bs ohne Kontext.
Mein konkretes Problem ist:
Ich bin dabei ein Steuerungsprogramm für einen dedicated Server zu schreiben.
Hierfür gibt es eine Klasse (welche ich benutze um globale Variablen zu umgehen indem ich die Felder der Klasse nutze).
Das Programm ist aus dem Spiel heraus steuerbar, indem man Kommandos in den Spielchat eingibt.
Das Programm nimmt diese Chatkommandos auf und ruft die jeweilige Funktion auf. ("/help" => call_user_func("chat_help"))
Weitere Funktionen werden über "require_once()" eingebunden und somit die Chatkommandos erweitert.
Das ganze hab ich jetzt etwas vereinfacht, aber ich denke der Zweck ist nun verständlicher.
Vllt kennt ihr ja auch einen anderen Weg neue Chatkommandos einzubinden...

Gruß und danke vorerst
__________________
Die schönsten Formulierungen sind üblicherweise auch die einfachsten. ADAM SMITH
FloMX ist offline   Mit Zitat antworten
Alt 28.03.2006, 15:41  
Erfahrener Benutzer
 
Registriert seit: 18.07.2004
Beiträge: 2.162
PHP-Kenntnisse:
Fortgeschritten
Basti
Standard

Zitat:
Zitat von FloMX
Hierfür gibt es eine Klasse (welche ich benutze um globale Variablen zu umgehen indem ich die Felder der Klasse nutze).
Es sind doch nicht die globalen Variablen das Problematische, sondern generell der Zugriff auf Werte ohne klare API bzw. die entsprechenden Abhängigkeiten und möglichen Konflikte. Ob du nun also ein global $b; oder ein global $B; $B->getWichtig(); oder ein B::getInstace()->getWichtig(); oder ein getB(); oder ein Registry::getB()->getWichtig() etc. schreibst ist, was diesen Punkt angeht mehr oder weniger Schnuppe.

Zitat:
[...]Das ganze hab ich jetzt etwas vereinfacht, aber ich denke der Zweck ist nun verständlicher.
Meine Frage zielte nicht auf den Zweck der Anwendung, in der dein Problem liegt, sondern auf den direkten Kontext des Problems. Oder ist das Problem, dass du über die Kommandos jeweils nur eine Funktion aufrufen kannst? Wenn du $B bislang als Parameter übergibst, kannst du auch gleich call_user_func(array($B, $cmd), $arg1, $arg2); schreiben oder was spricht dagegen?

Alternativ natürlich gleich $B->$cmd($args);

Basti
Basti ist offline   Mit Zitat antworten
Alt 28.03.2006, 15:42  
Erfahrener Benutzer
 
Registriert seit: 21.12.2004
Beiträge: 4.651
PHP-Kenntnisse:
Fortgeschritten
mepeisen ist ein Lichtblickmepeisen ist ein Lichtblickmepeisen ist ein Lichtblickmepeisen ist ein Lichtblickmepeisen ist ein Lichtblickmepeisen ist ein Lichtblick
mepeisen eine Nachricht über ICQ schicken mepeisen eine Nachricht über Skype™ schicken
Standard

call_user_func geht auch auf Klassen und allgemein gehen auch solche
Konstrukte:
$a->$methodName();

Zu deinem eigentlichen Problem: PHP4 oder PHP5?

Allgemein empfiehlt sich so etwas generisches nur bedingt, da das Tür
und Tor für "Hacker" öffnet. Du kannst genausogut einen Handler
schreiben, der ein Mapping zwischen Chat-Kommando und eigentlichem
Befehl herstellt. Beispiel:
PHP-Code:
<?php
class A
{
   function 
ChatCommandA()
   {
   }
   function 
ChatCommandB()
   {
   }
}

$mapping = array("/a" => "ChatCommandA""/b" => "ChatCommandB");
$myChatCommand "/a";
$myChatSystem = new A();

if (!
array_key_exists($myChatCommand$mapping)) die("Ungültiger Befehl");
$method $mapping[$myChatCommand];
$myChatSystem->$method();
?>
Nur als Anwendungsbeispiel, ungetestet
mepeisen ist offline   Mit Zitat antworten
Alt 28.03.2006, 15:55  
Benutzer
 
Registriert seit: 21.01.2005
Beiträge: 34
FloMX
Standard

hm, so eine Lösung wäre nat. nicht schlecht, allerdings ist es meines Wissens nach nicht möglich einer Klasse neue Methoden hinzuzufügen ohne diese Abzuleiten?
Dies würde den Namen der Klasse verändern, welcher aber eine wichtige Rolle spielt, da ich zum Schluss die Klasse mit allen neuen Methoden aufrufen möchte.
Außerdem wäre es nicht realisierbar ein Plugin zu schreiben wenn man nicht alle derzeitigen Plugins vor sich hat und deren Namen weiß :S
__________________
Die schönsten Formulierungen sind üblicherweise auch die einfachsten. ADAM SMITH
FloMX ist offline   Mit Zitat antworten
Alt 28.03.2006, 16:21  
Erfahrener Benutzer
 
Registriert seit: 21.12.2004
Beiträge: 4.651
PHP-Kenntnisse:
Fortgeschritten
mepeisen ist ein Lichtblickmepeisen ist ein Lichtblickmepeisen ist ein Lichtblickmepeisen ist ein Lichtblickmepeisen ist ein Lichtblickmepeisen ist ein Lichtblick
mepeisen eine Nachricht über ICQ schicken mepeisen eine Nachricht über Skype™ schicken
Standard

Soweit richtig, da es leider auch nicht geht während der Klassenbeschreibung zu includen... Aber mal ne andere Frage: Wer implementiert denn neue Funktionen bei dir? Nicht du?
__________________
Entwickler aus Leidenschaft und ein Zahnrad in einem der größten Java-Projekte der Welt.
mepeisen ist offline   Mit Zitat antworten
Antwort


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
Zugriff auf complexType Rückgabe Objekt von SOAP Aufruf? kuschky PHP-Fortgeschrittene 3 24.06.2010 12:35
JS: Einführung - Javascript im Schichtenmodell nikosch Tutorials 4 11.04.2009 17:06
Objekt im GET-Query wird nicht übertragen Ralpho PHP-Fortgeschrittene 10 05.05.2008 10:03
Óbjekt nich in Funktion initialisiert skaterboy PHP Tipps 2006 9 05.08.2006 13:44
Zugriff auf eine Klasse innerhalb einer Funktion -&amp;gt; Fehle PHP-Fortgeschrittene 23 05.02.2006 13:02
[Erledigt] PHP5 OOP Zugriff aus einem Objekt auf ein externes Objekt PHP Tipps 2006 5 28.01.2006 16:05
PHP-GTK Tutorial Beitragsarchiv 9 02.11.2005 21:07
Rückgabewert einer rekrusiven Funktion PHP-Fortgeschrittene 7 06.10.2005 18:44
(schnellere) Funktion zum Zusammenfassen von CSS PHP-Fortgeschrittene 21 08.08.2005 16:47
kann sich ein Objekt selbst serialisieren? ajo_silent PHP Tipps 2005-2 24 27.06.2005 09:13
Funktion in einer Funktion aufrufen? PHP Tipps 2005-2 11 14.06.2005 15:14
[Erledigt] Array-Übergabe in Funktion PHP Tipps 2005 1 08.05.2005 21:05
[Erledigt] Wie kann ich beliebig viele Werte an eine Funktion übergeben PHP Tipps 2005 11 25.01.2005 10:44
[Erledigt] sql syntax error in funktion, kann aber nix finden :( PHP Tipps 2004 10 20.07.2004 19:19
Referenz auf Funktion übergeben PHP-Fortgeschrittene 7 20.07.2004 09:51

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
php get verschachteltes objekt, soap php verschachteltes object als rückgabe, verschachteltes objekt php, php verschachteltes objekte zugreifen, class instanz in function, php auf methoden von verschachtelten objekten zugreifen, php zugriff auf objekt in einer function, php verschachteltes objekt, mychatsystem, php wert aus verschachteltem objekt, zugriff auf objekt in funktion php, php standard object feld zugriff was es nicht gibt, verschachteltes objekt, php funktion in verschachteltem objekt, http://www.php.de/php-fortgeschrittene/38576-zugriff-auf-verschachteltes-objekt-aus-funktion.html, php zugriff auf verschachtelte objekte, objekt an funktion

Alle Zeitangaben in WEZ +1. Es ist jetzt 20:08 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

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.