php.de

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

PHP-Fortgeschrittene Arbeiten mit PHP ohne Einschränkungen

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 13.10.2011, 10:40  
Erfahrener Benutzer
 
Benutzerbild von Lumio
 
Registriert seit: 12.10.2007
Beiträge: 149
PHP-Kenntnisse:
Fortgeschritten
Lumio ist zur Zeit noch ein unbeschriebenes Blatt
Standard [Erledigt] Magic functions und die dynamische Eigenschaftsbefüllung...

Hi,

ich hab zur Zeit ein Problem mit einer Singlton... ich kann das Problem jetzt gerade nicht so ganz in Worte fassen, deshalb gibts gleich einen Beispielcode von mir:

PHP-Code:
<?php
    
/** normaler container - keine singlton, nur eine Beispielklasse */
    
class container {
        private 
$container = array();
        
        function 
__set($name$value) {
            
$this->container[$name] = $value;
        }

        function 
__get($name) {
            return 
$this->container[$name];
        }
    }

    
$c = new container;

    
// das klappt ohne Probleme, der Wert steht in der Eigenschaft $container
    
$c->test "yeah";

    
// was ich jetzt versuchen möchte ist, den Namen der dynamisch
    // hinzugefügten Variable in eine andere Variable schreiben
    
$hm "variable";
    
$c->$hm = array();
    
$c->$hm['test'] = "wert";
    
// ausgeschrieben sollte das dann so aussehen:
    // $c->variable = array();
    // $c->variable['test'] = "wert";
    
    
var_dump($c);
    
// allerdings wird aus dem ganzen dann ein $container = array('test' => 'yeah', 'v' => 'wert');
?>
Wisst ihr was ich mein bzw wie ich das erreichen kann?
LG
__________________
www.citrosaft.com
Lumio ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

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

Alt 13.10.2011, 10:51  
Erfahrener Benutzer
 
Benutzerbild von litterauspirna
 
Registriert seit: 24.04.2008
Beiträge: 3.172
PHP-Kenntnisse:
Anfänger
litterauspirna sorgt für eine eindrucksvolle Atmosphärelitterauspirna sorgt für eine eindrucksvolle Atmosphäre
litterauspirna eine Nachricht über ICQ schicken
Standard

Du musst schon mal eine Problemstellung liefern was du eigentlich erreichen willst. Mache dir doch bitte vorher Gedanken darüber, ein ich habe ein Problem aber weiß selber nicht welches Gedöns ist für keinen hier verwertbar.

Zu deinem Code, dass sieht sieht sehr merkwürdig aus, was immer du auch vorhast beschreieb es genau.
Aber du weißt schon zu was __set() und __get() da sind und wofür sie Gedacht sind und was sie sind wenn du sie angelegt hast oder=

Gruß der Litter
__________________
Aus dem Dynamo Lande kommen wir. Trinken immer reichlich kühles Bier. Und dann sind wir alle voll, die Stimmung ist so toll. Aus dem Dynamo Lande kommen wir.
http://www.lit-web.de
litterauspirna ist offline   Mit Zitat antworten
Alt 13.10.2011, 11:17  
Erfahrener Benutzer
 
Registriert seit: 19.06.2009
Beiträge: 837
PHP-Kenntnisse:
Fortgeschritten
Jens Clasen ist einfach richtig nettJens Clasen ist einfach richtig nettJens Clasen ist einfach richtig nettJens Clasen ist einfach richtig nettJens Clasen ist einfach richtig nett
Standard

Du suchst:
PHP-Code:
$c->{$hm}['test'
wobei das nur funktioniert, sofern __get() ne Referenz zurück gibt - andernfalls wird Dir PHP in einer Notice mitteilen, dass indirekte Modifikationen nicht funktionieren.

Gruß Jens
Jens Clasen ist offline   Mit Zitat antworten
Alt 13.10.2011, 11:24  
Erfahrener Benutzer
 
Benutzerbild von litterauspirna
 
Registriert seit: 24.04.2008
Beiträge: 3.172
PHP-Kenntnisse:
Anfänger
litterauspirna sorgt für eine eindrucksvolle Atmosphärelitterauspirna sorgt für eine eindrucksvolle Atmosphäre
litterauspirna eine Nachricht über ICQ schicken
Standard

Für solche Fälle nutzt man eigentlich auch keine __set() und __get() Methoden, eher sollte man da auf eine eigengeschriebene set und get Methode zurückgreifen oder eine add Methode und das ganze als ein Fluentinterface.
__________________
Aus dem Dynamo Lande kommen wir. Trinken immer reichlich kühles Bier. Und dann sind wir alle voll, die Stimmung ist so toll. Aus dem Dynamo Lande kommen wir.
http://www.lit-web.de
litterauspirna ist offline   Mit Zitat antworten
Alt 13.10.2011, 14:39  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.987
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Zitat:
$hm = "variable";
$c->$hm = array();
$c->$hm['test'] = "wert";
Ist auch sehr speziell um nicht zu sagen: unübersichtlich. Und oh Wunder, mit Array hättest Du ähnliche Probleme. Ist auch kein Wunder, denn $$hm (was dem Beispiel etwa entspricht) aufzulösen, wenn man nicht weiß, ob der nachfolgende Index zu $hm oder dem Gesamtkonstrukt gehört, dürfte den Interpreter vor eine echte Herausforderung stellen:

$ von $hm['test'] vs. Index ['test'] von $$hm

Wozu willst Du denn sowas umsetzen?
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist offline   Mit Zitat antworten
Alt 13.10.2011, 21:05  
Erfahrener Benutzer
 
Benutzerbild von Lumio
 
Registriert seit: 12.10.2007
Beiträge: 149
PHP-Kenntnisse:
Fortgeschritten
Lumio ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Sorry Leute, ich hätt den Post wirklich erst jetzt verfassen sollen, wo ich alles beisammen habe.

Also meine Singleton sieht wie folgt aus:
PHP-Code:
<?php
    
final class C_MAIN_Container {
        private static 
$instance null;
        
        private 
$container = array('tmp' => array());
        
        private function 
__construct() {}
        private function 
__clone() {}
        public function 
__toString() {
            return 
false;
        }
        
        public function 
instance() {
            if (
self::$instance === null) {
                
self::$instance = new self;
            }
            
            return 
self::$instance;
        }
        
        public function 
__set($name$value) {
            
$this->container[$name] = $value;
        }
        
        public function &
__get($name) {
            if (
array_key_exists($name$this->container)) {
                return 
$this->container[$name];
            }
            
            return 
$null;
        }
        
// ...
    
}
?>
Ganz normal also. Ich habe das auch mit der Referenz schon eingebunden gehabt.
Der Container wird in mehrere Bereiche aufgeteilt. Also die Eigenschaft $container hat sozusagen Hauptbereiche:
PHP-Code:
array(
   
'extensions' => array(),
   
'controllers' => array()
   
//....
); 
Mein Problem besteht jetzt darin, dass ich eben Klassen dynamisch reinlade.

Beispielsweise schreib ich folgende Zeilen:
PHP-Code:
loadClass('foo'); 
Die loadClass-Funktion ist in etwa wie folgt aufgebaut:
PHP-Code:
function loadClass($name$extend='bereich') {
   
$file $name.'.php';

   
// überprüfung ob datei existiert und ob es noch im erlaubten bereich gespeichert ist
   // ...

   
$class ucwords($name);

   
// Im Normalfall schreib ich jetzt die Variablen in den Container

   // Datei laden und überprüfungen anstellen
   
require_once $file;
   
// ... existiert Klasse...
   
   // Die Funktion instance gibt mir den Container zurück.
   // also ...
   // * $extend beinhaltet den Bereich, die virtuelle Eigenschaft des Containers
   // * $name beinhaltet den Namen, als was die Klasse im Bereich geladen wird
   // * $class beinhaltet eben den Klassennamen
   
instance()->$$extend[$name] = new $class;
   
   
// überprüfen ob die Methode init existiert und dann ausführen...
   
instance()->$$extend[$name]->init();

Ich glaub am einfachsten ist es, wenn der Container eine methode hat, die sich um das ganze kümmert. Beispielsweise
PHP-Code:
instance()->extend($extend, new $class); 
War das halbwegs verständlich? Danke schonmal
__________________
www.citrosaft.com
Lumio ist offline   Mit Zitat antworten
Alt 14.10.2011, 00:16  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.987
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Zitat:
Ich glaub am einfachsten ist es, wenn der Container eine methode hat, die sich um das ganze kümmert.
Ja. So macht man das in OOP.
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist offline   Mit Zitat antworten
Alt 14.10.2011, 00:39  
Moderator
 
Benutzerbild von Chriz
 
Registriert seit: 11.05.2008
Beiträge: 6.268
Chriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer Anblick
Standard

Mir ist dein Klassenkonstrukt irgendwie zu virtuell ..

Zitat:
Zitat von Lumio Beitrag anzeigen
Wisst ihr was ich mein bzw wie ich das erreichen kann?
LG
Wenn die Frage immer noch offen ist .. mit $c->__set($variable, $value) kannst du auch variable Variablen setzen.

Halte allerdings absolut garnichts von __set und __get. Das erspart anfangs Tipparbeit, entfaltet sich allerdings zum Zeitkiller, sobald das Projekt mal wieder angefasst werden muss.
__________________
"Nuschel ich?" - "Was?"
Chriz ist offline   Mit Zitat antworten
Alt 14.10.2011, 23:44  
Erfahrener Benutzer
 
Benutzerbild von Lumio
 
Registriert seit: 12.10.2007
Beiträge: 149
PHP-Kenntnisse:
Fortgeschritten
Lumio ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Ja naja, ich lade ja die gebrauchten Klassen in unterschiedlichen Bereichen. Insofern macht es meiner Meinung nach schon Sinn.

Aber Danke fürs zu hören und helfen Ich machs jetz mit der extend Variante
__________________
www.citrosaft.com
Lumio ist offline   Mit Zitat antworten
Alt 15.10.2011, 06:41  
Erfahrener Benutzer
 
Benutzerbild von mermshaus
 
Registriert seit: 14.06.2009
Beiträge: 1.731
PHP-Kenntnisse:
Fortgeschritten
mermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz sein
Standard

Obligatorische Anmerkung, dass Singletons ungünstig sind, weil sie Abhängigkeiten verdecken und Unit-Testing erschweren.

- http://misko.hevery.com/code-reviewers-guide/ (vor allem wohl Flaw #3)
__________________
Blog | Buch | Kaloa
mermshaus 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
Dynamische erstellte Inputfelder Banshi PHP Einsteiger 10 18.06.2011 05:36
Dynamische Signatur KazuMikura PHP Tipps 2010 1 12.05.2010 19:11
Dynamische Referenzierung von Super Globals robo47 PHP-Fortgeschrittene 6 19.12.2009 14:26
Fehler beim kompilieren von php 5.2.9 malio Server, Hosting und Workstations 11 05.06.2009 18:40
Dynamische Page von A-Z Diamond GrafixX PHP Tipps 2009 8 29.05.2009 20:14
[Erledigt] dynamische Liste Abfragen verknüpfen und ausgeben. abi PHP Tipps 2009 3 13.05.2009 11:46
[Erledigt] Dynamische Signatur als PNG Shadowlauch Scriptbörse 26 09.05.2009 15:16
Dynamische Seitennavigation Moe PHP Tipps 2008 17 30.09.2008 11:20
Ausführing von functions in function fatsurfer PHP Tipps 2008 4 12.06.2008 13:21
Partition Magic - Mist? cybertrek Off-Topic Diskussionen 8 09.02.2007 11:14
Dynamische Umfrage webbi PHP-Fortgeschrittene 4 21.06.2006 13:54
PHP Magic Plus PHP-Fortgeschrittene 1 30.09.2005 13:46
Dynamische Grafik in PHP PHP Tipps 2005-2 6 26.07.2005 11:47

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
php magic functions, dynamischer funktionsaufruf php 5.2.9, php dynamisch eigenschaften name, wofür __get, php magic container, php magic eigene beiträge anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 01:11 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