php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger

PHP Einsteiger PHP Problemlösungen für Spracheinsteiger
Archive: 2004, 2004/2, 2005, 2005/2, 2006, 2007, 2008, 2009, 2010,

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 08.12.2011, 10:48  
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 Array als Parameterliste in Factory nutzen

Hallo Leute,

ich stehe grad vor einem Problem wo ich irgendwie nen fetten Denkhänger habe.

Ich habe mir eine Factory Klasse geschrieben deren Konstruktor Paramter bekommt.
Ein Parameter davon ist ein Array dessen Elemente die Parameterliste abbilden soll.

Hier der Code der Factory.
PHP-Code:
<?php
require_once LIB_PATH 'Factory/FactoryException.php';

/**
 * 
 *     @class Factory
 *     @author LIT-WEB
 *     @package classes
 *     @subpackage Factory
 * 
 *     Objektfabrikklsse erzeug Objekte anhand der übergebenen Parameter, sie kann auch an spezielle
 *     Factory Klassen vererbt werden
 *
 */
class Factory
{
    
/**
     * 
     *     Enthält den Klassennamen
     *     @var String
     */
    
protected $_class;
    
    
/**
     * 
     *     Enthält Pfad zur Klasse
     *     @var String
     */
    
protected $_path;
    
    
/**
     * 
     *     Enthält das erzeugte Objekt
     *     @var String
     */
    
protected $_object;
    
    
/**
     * 
     *    Enthält die Konstruktorparameter
     *     @var String
     */
    
protected $_args;
    
    
/**
     * 
     *     Konstruktor
     *     
     *     Nimmt Parameter für die Objekterzeugung entgegen und initialisiert diese
     *     @param String $pClass Name der Klasse von der das Objekt erzeugt werden soll
     *     @param Array $pArgs Parameter Argumente für den Konstruktor des zu erzeugenden Objektes
     *     @param String $pPath Pfad zur Klasse falls benötigt
     */
    
public function __construct($pClass, array $pArgs null$pPath null)
    {
        
$this->_class $pClass;
        
$this->_path $pPath;
        
$this->_args $this->_initArgs($pArgs);
        
        
//testecho ausgabe für parameterliste
        
echo $this->_args;
        
        
$this->_createObjectInstance();
    }
    
    
/**
     * 
     *     Gibt das fertig erzeugte Objekt zur öffentlichen Benutzung zurück
     *     @throws FactoryException
     *     @return Object
     */
    
public function getObject()
    {
        if(!
is_object($this->_object)) {
            throw new 
FactoryException($this->_object ' is non a Object!');
        } else {
            return 
$this->_object;
        }
    }
    
    
/**
     * 
     *     Bildet eine Zeichenkette aus den Übegabeparamtern für den Konstruktor
     *     @param Array $pArgs
     *     @return Array
     */
    
protected function _initArgs($pArgs)
    {
        
$args null;
        
        if(
$pArgs !== null) {
            
$i 0;
            
$length count($pArgs);
            
            foreach(
$pArgs as $key => $value) {
                
$i++;
                
                if(
$i $length) {
                    
$args .= $value ',';
                } else {
                    
$args .= $value;
                }
            }
        }
        
        return 
$args;
    }
    
    
/**
     * 
     *     Instsnziert ein Objekt mit seinen Konstruktorparametern
     *     @throws FactoryException
     */
    
protected function _createObjectInstance()
    {
        if(
$this->_path !== null) {
            require_once 
$this->_path $this->_class;
        }
        
        if(!
class_exists($this->_class)) {
            throw new 
FactoryException($this->_class ' is not a Class!');
        }

        if(
$this->_args !== null) {
            
$this->_object = new $this->_class($this->_args);
        } else {
            
$this->_object = new $this->_class();
        }
    }
}
In der Methode _initArgs($pArgs) soll nun das Array zu einer Parameterliste umgeformt werden, das aber klappt so nicht, weil ein String raus kommt und somit nur als ein Paramter abgebildet wird.

An meinem Beispiel gehts z.B. um die Instanz zu einem PDO Objekt.
Da hole ich mir die Daten zum verbinden aus einer xml Config, das passt ja auch alles.

So sieht der Beispieleinsatz aus.

PHP-Code:
    public function initDb()
    {    
        
$this->_db = new Factory(
            
$this->_config->resources->db->class,
            array(
                
$this->_config->resources->db->adapter ':' .
                
'host=' $this->_config->resources->db->host ';' .
                
'dbname=' $this->_config->resources->db->dbname,
                
$this->_config->resources->db->user
            
)
        );

Beim verbinden kommt dann folgender Fehler zustande.

Zitat:
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000] [1044] Access denied for user ''@'localhost' to database 'gregor_wendt,root'' in D:\Softwareentwicklung\Webentwicklung\WendtNeu\cla sses\Factory\Factory.php:124 Stack trace: #0 D:\Softwareentwicklung\Webentwicklung\WendtNeu\cla sses\Factory\Factory.php(124): PDO->__construct('mysql:host=loca...') #1 D:\Softwareentwicklung\Webentwicklung\WendtNeu\cla sses\Factory\Factory.php(62): Factory->_createObjectInstance() #2 D:\Softwareentwicklung\Webentwicklung\WendtNeu\app lication\Bootstrap.php(35): Factory->__construct('PDO', Array) #3 D:\Softwareentwicklung\Webentwicklung\WendtNeu\cla sses\Controller\Front.php(269): Bootstrap->initDb() #4 D:\Softwareentwicklung\Webentwicklung\WendtNeu\cla sses\Controller\Front.php(130): Front->_initApplicationBootstrap() #5 D:\Softwareentwicklung\Webentwicklung\WendtNeu\cla sses\Controller\Front.php(101): Front->_init() #6 D:\Softwareentwicklung\Webentwicklung\WendtNeu\ind ex.php(22): Front->run() #7 {main} thrown in D:\Softwareentwicklung\Webentwicklung\WendtNeu\cla sses\Factory\Factory.php on line 124
Das sagt mir das nur ein Paramter übergeben wird und der User Parameter fehlt.

Das Testecho aus dem Konstruktor sieht zwar so aus wie eine Parameterliste

Zitat:
mysql:host=localhost;dbname=gregor_wendt,root
scheint aber keine zu sein.

Meine Frage wie kann ich es erreichen das dieses Array so als Parameterliste umgeformt wird das jedes Arrayelement am Ende auch wirklich einen Übergabeparameter ergibt.

Vielen Dank für eure Zeit und Hilfe 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 gerade online   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

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

Alt 08.12.2011, 11:00  
Benutzer
 
Registriert seit: 27.03.2006
Beiträge: 60
PHP-Kenntnisse:
Anfänger
Dadelu ist in Verruf geraten
Standard

Hi Litter

Könnte es sein, dass das Problem nichts mit deiner Frage zu tun han? Du kriegst ja ein Access Denied für User @localhost. Sieht ein wenig so aus, als würdest du zwar die DB, den DBNamen mitgeben, aber keinen User?
Dadelu ist offline   Mit Zitat antworten
Alt 08.12.2011, 11:06  
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

Zitat:
Zitat von Dadelu Beitrag anzeigen
Hi Litter

Könnte es sein, dass das Problem nichts mit deiner Frage zu tun han? Du kriegst ja ein Access Denied für User @localhost. Sieht ein wenig so aus, als würdest du zwar die DB, den DBNamen mitgeben, aber keinen User?
Die Feststellung habe ich doch auch schon gemacht und das hat was mit dem Problem zu tun, dass hast richtig erkannt. Es wird ein String durch mein Verfahren übergeben als Parameter der so aussieht als wäre es eine Parameterliste, aber ist es eben nicht.

Deshalb meine Frage wie ich ein Array zu umgeformt bekomme das dann eine Einsatzfähige Paramterliste für Methoden und Konstriktoren entsteht.
__________________
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 gerade online   Mit Zitat antworten
Alt 08.12.2011, 11:16  
Benutzer
 
Registriert seit: 27.03.2006
Beiträge: 60
PHP-Kenntnisse:
Anfänger
Dadelu ist in Verruf geraten
Standard

In der Funktion initDb() erzeugst du ja nur ein Array mit einem Element und das ist genau der String denn du nacher erhälst, oder verstehe ich den Fehler nicht?

Wenn du einen Array erzeugen möchtest, müsstest du ja die Keys setzen mit den entsprechenden Werten: host=>blabla und dann kannst du darüber loopen mit foreach?
Dadelu ist offline   Mit Zitat antworten
Alt 08.12.2011, 11:20  
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

In initDb() übergebe ich als Parameter ein Array mit 2 Elementen.

In der Factory gehe ich das Array durch und durch Verkettungsoperator . werden die Elemente in einen String geschrieben und mit einem , getrennt.

Das ist eben das Problem der String sieht dann aus wie eine Paramterliste durch das ,.
Aber es ist eben keine.
__________________
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 gerade online   Mit Zitat antworten
Alt 08.12.2011, 11:48  
Erfahrener Benutzer
 
Benutzerbild von jspit
 
Registriert seit: 19.08.2011
Beiträge: 701
PHP-Kenntnisse:
Anfänger
jspit wird schon bald berühmt werden
Standard

1. Warum nimmst du nicht implode ?
2. Wenn dein Array kürzer ist, du aber ein vollständiges brauchst, dann in etwa so:
PHP-Code:
$defaultpar "1,2,3,4";
$a = array(5,6);
$komplett array_replace(explode(",",$defaultpar),$a);
$string implode(",",$komplett); 
jspit ist offline   Mit Zitat antworten
Alt 08.12.2011, 11:58  
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

Zitat:
Zitat von jspit Beitrag anzeigen
1. Warum nimmst du nicht implode ?
2. Wenn dein Array kürzer ist, du aber ein vollständiges brauchst, dann in etwa so:
PHP-Code:
$defaultpar "1,2,3,4";
$a = array(5,6);
$komplett array_replace(explode(",",$defaultpar),$a);
$string implode(",",$komplett); 
Weil ich dann genau das selbe Problem habe, ich habe dann genauso einen String der aussieht wie eine Patamterliste aber keine ist.

Ich habe nun über Google im Manual folgende Funktion gefunden call_user_func_array

Mit der habe ich es auch versucht. Hier der Code.

PHP-Code:
<?php
require_once LIB_PATH 'Factory/FactoryException.php';

/**
 * 
 *     @class Factory
 *     @author LIT-WEB
 *     @package classes
 *     @subpackage Factory
 * 
 *     Objektfabrikklsse erzeug Objekte anhand der übergebenen Parameter, sie kann auch an spezielle
 *     Factory Klassen vererbt werden
 *
 */
class Factory
{
    
/**
     * 
     *     Enthält den Klassennamen
     *     @var String
     */
    
protected $_class;
    
    
/**
     * 
     *     Enthält Pfad zur Klasse
     *     @var String
     */
    
protected $_path;
    
    
/**
     * 
     *     Enthält das erzeugte Objekt
     *     @var String
     */
    
protected $_object;
    
    
/**
     * 
     *    Enthält die Konstruktorparameter
     *     @var String
     */
    
protected $_args = array();
    
    
/**
     * 
     *     Konstruktor
     *     
     *     Nimmt Parameter für die Objekterzeugung entgegen und initialisiert diese
     *     @param String $pClass Name der Klasse von der das Objekt erzeugt werden soll
     *     @param Array $pArgs Parameter Argumente für den Konstruktor des zu erzeugenden Objektes
     *     @param String $pPath Pfad zur Klasse falls benötigt
     */
    
public function __construct($pClass, array $pArgs null$pPath null)
    {
        
$this->_class $pClass;
        
$this->_path $pPath;
        
$this->_args $pArgs;
        
//        echo '<pre>';
//            print_r($this->_args);
//        echo '</pre>';
        
        
$this->_createObjectInstance();
    }
    
    
/**
     * 
     *     Gibt das fertig erzeugte Objekt zur öffentlichen Benutzung zurück
     *     @throws FactoryException
     *     @return Object
     */
    
public function getObject()
    {
        if(!
is_object($this->_object)) {
            throw new 
FactoryException($this->_object ' is non a Object!');
        } else {
            return 
$this->_object;
        }
    }
    
    
/**
     * 
     *     Instsnziert ein Objekt mit seinen Konstruktorparametern
     *     @throws FactoryException
     */
    
protected function _createObjectInstance()
    {
        if(
$this->_path !== null) {
            require_once 
$this->_path $this->_class;
        }
        
        if(!
class_exists($this->_class)) {
            throw new 
FactoryException($this->_class ' is not a Class!');
        }

        if(
$this->_args !== null) {
            
$this->_object = new $this->_class();
            
call_user_func_array(array($this->_object'__construct'), $this->_args);
        } else {
            
$this->_object = new $this->_class();
        }
    }
}
So und hier noch der Einsatzversuch.

PHP-Code:
public function initDb()
    {    
        
$this->_db = new Factory(
            
$this->_config->resources->db->class,
            array(
                
$this->_config->resources->db->adapter ':' .
                
'host=' $this->_config->resources->db->host ';' .
                
'dbname=' $this->_config->resources->db->dbname,
                
$this->_config->resources->db->user
            
)
        );

Und die darauf folgende Fehlermeldung.

Zitat:
Warning: PDO::__construct() expects at least 1 parameter, 0 given in D:\Softwareentwicklung\Webentwicklung\WendtNeu\cla sses\Factory\Factory.php on line 98

Warning: call_user_func_array() expects parameter 1 to be a valid callback, first array member is not a valid class name or object in D:\Softwareentwicklung\Webentwicklung\WendtNeu\cla sses\Factory\Factory.php on line 99
Was mache ich da mit der Funktion call_user_func_array falsch?
__________________
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 gerade online   Mit Zitat antworten
Alt 08.12.2011, 12:17  
Erfahrener Benutzer
 
Benutzerbild von jspit
 
Registriert seit: 19.08.2011
Beiträge: 701
PHP-Kenntnisse:
Anfänger
jspit wird schon bald berühmt werden
Standard

Langsam kapier ich was du suchst. So ?
PHP-Code:
function userfkt($p1,$p2) {
   echo 
"p1:".$p1." p2:".$p2;
}
$par = array("erstes arg","zweites arg");
call_user_func_array("userfkt",$par);
//liefert 'p1:erstes arg p2:zweites arg ' 
Der Name der callback-fkt. muß als string übergeben werden.
jspit ist offline   Mit Zitat antworten
Alt 08.12.2011, 12:23  
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

Aber so mache ich das ja.

Hier der Auszug aus dem Manual.

PHP-Code:
class foo {
    function 
bar($arg$arg2) {
        echo 
__METHOD__" got $arg and $arg2\n";
    }
}

// Call the $foo->bar() method with 2 arguments
$foo = new foo;
call_user_func_array(array($foo"bar"), array("three""four")); 
Und hier mein Codeauszug.

PHP-Code:
protected function _createObjectInstance()
    {
        if(
$this->_path !== null) {
            require_once 
$this->_path $this->_class;
        }
        
        if(!
class_exists($this->_class)) {
            throw new 
FactoryException($this->_class ' is not a Class!');
        }

        if(
$this->_args !== null) {
            
$this->_object = new $this->_class();
            
call_user_func_array(array($this->_object'__construct'), $this->_args);
        } else {
            
$this->_object = new $this->_class();
        }
    } 
Auftretender Fehler diesbezüglich.

Zitat:
Warning: call_user_func_array() expects parameter 1 to be a valid callback, first array member is not a valid class name or object in D:\Softwareentwicklung\Webentwicklung\WendtNeu\cla sses\Factory\Factory.php on line 99
Codezeile 99 ist der Aufruf von call_user_func_array.

Ich mache es denke ich wie im Beispiel, der erste Parameter von call_user_func_array kann auch ein Array sein dessen erstes Element eine Objektinstanz ist und das zweite Element der Funktionsname als String.
Genau das mache ich.
Und der 2 Funktionsparameter ist ein Array mit den Parameterargumenten.
Auch das ist der Fall.

Entweder übersehe ich etwas ausschlaggebendes oder ich weiß momentan nicht was ich da verzepfe.
__________________
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 gerade online   Mit Zitat antworten
Alt 08.12.2011, 12:28  
Erfahrener Benutzer
 
Benutzerbild von jspit
 
Registriert seit: 19.08.2011
Beiträge: 701
PHP-Kenntnisse:
Anfänger
jspit wird schon bald berühmt werden
Standard

Lt. meiner Docu darf callback kein array sein...

Edit: Doch. das Beispiel aus dem Man ist ok.
Edit2: existiert $this->_object ? Ev. so:

PHP-Code:
call_user_func_array(array($this'__construct'), $this->_args); 

Geändert von jspit (08.12.2011 um 12:44 Uhr).
jspit 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
Array werte zusammen rechnen fabi288 PHP Einsteiger 13 03.01.2011 16:08
mehrdimensionales array inhalte tauschen pidaman PHP Tipps 2010 18 27.08.2010 16:58
[Erledigt] Bereich einer Array lässt sich nicht ausgeben Polliny PHP Tipps 2010 54 21.06.2010 15:30
Feed in Datenbank eintragen (Formate: json, php serialized, xml) high_five Datenbanken 5 17.06.2010 03:04
[Erledigt] Sortierung mehrerer Arrays philosapiens PHP Tipps 2010 16 08.06.2010 05:22
Ein (Teil)Array anhand von level und depth zurückgeben. greatcthulhu Scriptbörse 4 16.04.2010 10:45
[Erledigt] Problem bei update mit array feldern fulltilt PHP Tipps 2010 6 13.02.2010 00:59
PHPLot von der Datenbank zum mehrdimensionalen Array mannimammut PHP Tipps 2009 1 15.12.2009 10:40
merge Array? tommy_725 PHP Tipps 2009 3 07.08.2009 18:30
[Erledigt] array sortieren PHP Tipps 2004 17 13.05.2009 10:44
Übersicht aus mehrdimensionalem Array erzeugen Crypi PHP-Fortgeschrittene 0 30.01.2006 13:44
Problem beim vergleichen von 2 Arrays PHP Tipps 2005-2 1 06.10.2005 14:25
bbcode - Classe PHP-Fortgeschrittene 4 18.09.2004 17:30


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