PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Fragen zu Laravel, YII oder anderen PHP-Frameworks. |
 |

23-04-2016, 19:44
|
ShopNix
Registrierter Benutzer
|
|
Registriert seit: Apr 2016
Beiträge: 7
|
|
Best Practices OOP
Nachdem ich mich nun schon eine ganze Weile mit PHP herumschlage und mich bisher einigermaßen erfolgreich um das Thema OOP gedrückt habe, möchte ich jetzt versuchen, den Einstieg zu schaffen.
Aktuell treiben mich zwei Fragen um:
1. Wie reiche ich ich ein Datenbankobjekt, dass ja nun an allen Ecken und Enden gebraucht wird, durch?
2. Ein SOAP-Service gibt mir ein recht komplexes Objekt als Response zurück. Jede Doku zu OOP zeigt mir, wie ich vom Allgemeinen zum Besonderen gehe. In dem Falle ist es umgekehrt. Jedes Response-Objekt hat ein paar Gemeinsamkeiten wie Success und Timestamp, aber auch Besonderheiten, die sowohl von den Inhalten, als auch vom Request abhängen. Wie fange ich an?
|

25-04-2016, 10:51
|
chorn
Registrierter Benutzer
|
|
Registriert seit: Nov 2011
Beiträge: 207
|
|
zu 1. sieh dir mal MVC und Dependency Injection an
|

26-04-2016, 18:10
|
ShopNix
Registrierter Benutzer
|
|
Registriert seit: Apr 2016
Beiträge: 7
|
|
Mit derlei Schlagworten kann ich nur wenig anfangen. Aber sei's drum. Ich habe mir eine OpenSource Software angeschaut und und daraus die folgende Klasse gebastelt:
PHP-Code:
class sxDb {
/** Database connection object
* @var DB */
protected static $DB = null;
/** sxDb Instance */
protected static $_instance = null;
/** Returns database object
* @return PDO */
public static function getDb()
{
if ( self::$DB === null ) {
$oInst = self::getInstance();
$aDbConf = array('dbHost' => 'localhost',
'dbUser' => 'xyz',
'dbPass' => 'zyx',
'dbName' => 'ebay',
'dbEngine' => 'mysql',
'dbCharset' => 'utf8');
$dns=$aDbConf['dbEngine'].':dbname='.$aDbConf['dbName'].';host='.$aDbConf['dbHost'].';charset='.$aDbConf['dbCharset'];
$oDb = new pdo($dns, $aDbConf['dbUser'], $aDbConf['dbPass']);
$oDb->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$oDb->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
self::$DB = $oDb;
}
return self::$DB;
}
/** Returns Singleton instance
* @return sxDb */
public static function getInstance()
{
if ( !self::$_instance instanceof sxDb ) {
self::$_instance = new sxDb();
}
return self::$_instance;
}
}
Das scheint ein Singleton Design Pattern zu sein und funktioniert erstmal.
Nun kann ich an beliebiger Stelle im Programm
PHP-Code:
$db = sxDb::getDb();
notieren, und habe eine bestehende Verbindung, falls nicht, wird sie aufgebaut.
Kritik ist ausdrücklich erwünscht.
|

26-04-2016, 18:21
|
ShopNix
Registrierter Benutzer
|
|
Registriert seit: Apr 2016
Beiträge: 7
|
|
Und gleich die nächste Frage.
PHP-Code:
$db = sxDb::getDb();
$sql = "insert into sxc_config (configuration_key, configuration_value, configuration_group_id) values (?, ?, ?)";
try {
$sth = $db->prepare($sql);
} catch (Exception $ex) {
die("$sql hat nicht funktioniert: ".print_r($ex)."\n ");
}
Oben habe ich die Attribute
PHP-Code:
$oDb->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
und erwartet, dass mit ein Fehler um die Ohren fliegt, wenn das SQL-Statement falsch ist, im obigen Beispiel ist der Name der Tabelle falsch.
Tatsächlich poppt der Fehler erst beim execute auf.
|

26-04-2016, 19:20
|
h3ll
Registrierter Benutzer
|
|
Registriert seit: Mar 2008
Beiträge: 3.769
|
|
Zitat:
Zitat von ShopNix
Tatsächlich poppt der Fehler erst beim execute auf.
|
Das liegt daran, wie PDO arbeitet. Erst beim Execute wird eine Abfrage an die Datenbank gesendet.
static ist übrigens böse und solltest du gleich raushauen. Außerdem hat die Datenbankkonfiguration nichts in einer Klasse verloren. Sowas gehört in Konfigurationsdateien (zB. ini-Dateien).
|

26-04-2016, 20:39
|
ShopNix
Registrierter Benutzer
|
|
Registriert seit: Apr 2016
Beiträge: 7
|
|
Zitat:
Zitat von h3ll
Das liegt daran, wie PDO arbeitet. Erst beim Execute wird eine Abfrage an die Datenbank gesendet.
|
Danke. Das ist natürlich Bockmist, denn MySQL unterstützt das richtig.
PHP-Code:
mysql> prepare stmt1 from 'select Description from ShippingServiceDetail limit 10';
ERROR 1146 (42S02): Table 'ebay.ShippingServiceDetail' doesn't exist
mysql> prepare stmt1 from 'select Description from ShippingServiceDetails limit 10;
Query OK, 0 rows affected (0.00 sec)
Statement prepared
Zitat:
Zitat von h3ll
static ist übrigens böse und solltest du gleich raushauen.
|
Ich bin auch böse und lass mich trotzdem nicht hauen. Schon gar nicht raus.
Zitat:
Zitat von h3ll
Außerdem hat die Datenbankkonfiguration nichts in einer Klasse verloren. Sowas gehört in Konfigurationsdateien (zB. ini-Dateien).
|
Das ist ein Beispiel zu Lernzwecken.
|

26-04-2016, 20:53
|
h3ll
Registrierter Benutzer
|
|
Registriert seit: Mar 2008
Beiträge: 3.769
|
|
Zitat:
Zitat von ShopNix
Das ist ein Beispiel zu Lernzwecken.
|
Man lernt mehr, wenn mans gleich richtig macht.
|

04-05-2016, 18:09
|
hall
Registrierter Benutzer
|
|
Registriert seit: Jun 2004
Ort: Berlin
Beiträge: 818
|
|
Wie schon hier geschrieben wurde, kann man solche Abhängigkeiten beispielsweise mit "Dependency Injection" auflösen und die Anwendung auch leichter "testbar", etc machen:
https://de.wikipedia.org/wiki/Dependency_Injection
Dann wäre auch die angesprochene Auslagerung von Konfigurationsdaten besser handle und wartbarer als mit "hard" codierten Werten in irgendeiner Klasse (unflexibel, blöd wenn man was testen will, etc). Das so statisch auszulagern, naja, es kommt auf das Projekt, das Ziel, eigene Erfahrung an  Aber damit schaffst du dir eine Abhängigkeit zu dieser Klasse.. Was ist, falls eine andere Datenbank benutzt werden soll.. oder eine mit "Dummy"-Werten zu präsentationszwecken..? Vielleicht ist es auch zuviel am Anfang, wenn man OOP verstehen möchte.
Um DI besser zu verstehen, sei auch hier, wie meist woanders, auf "pimpel" hingewiesen:
Pimple - A simple PHP Dependency Injection Container
Zu Deiner zweiten Frage, fällt mir spontan nur WSDL ein - aber Soap ist nicht wirklich mein Thema
SOAP and PHP in 2014 — Whitewashing
https://de.wikipedia.org/wiki/Web_Se...ption_Language
schönen Feiertag zusammen
(von einem der schon ewig nicht mehr online war  )
__________________
mfg
|

09-05-2016, 13:09
|
ShopNix
Registrierter Benutzer
|
|
Registriert seit: Apr 2016
Beiträge: 7
|
|
Zitat:
Zitat von hall
...
Dann wäre auch die angesprochene Auslagerung von Konfigurationsdaten besser handle und wartbarer als mit "hard" codierten Werten in irgendeiner Klasse (unflexibel, blöd wenn man was testen will, etc). Das so statisch auszulagern, naja, es kommt auf das Projekt, das Ziel, eigene Erfahrung an  Aber damit schaffst du dir eine Abhängigkeit zu dieser Klasse.. Was ist, falls eine andere Datenbank benutzt werden soll.. oder eine mit "Dummy"-Werten zu präsentationszwecken..? Vielleicht ist es auch zuviel am Anfang, wenn man OOP verstehen möchte. ...
|
Ich begreife beim besten Willen nicht, wie man sich an hart codierten Zugangsdaten der Datenbank in einem Beispiel abarbeiten kann. In einem Beispiel geht es darum, einen beschriebenen Zusammenhang zu verdeutlichen, idealerweise so, dass es direkt funktioniert und leicht lesbar ist.
Schön, vielleicht hätte ich besser mit der Konfiguration als mit der Datenbank begonnen. Beides sind Dinge, die man an allen Ecken und Enden in nahezu jedem Programm braucht, das eine Datenbank nutzt.
In meinem Fall ist's ohnehin fast egal, weil in der Geschichte, die ich hier vorhabe, alle weiteren Konfigurationsparameter in der Datenbank liegen werden. Wobei mir, um das noch einmal zu betonen, durchaus klar ist, dass die Zugangsdaten im Endprodukt absolut nichts in der DB-Klasse verloren haben.
Zitat:
Zitat von hall
|
Das scheint wirklich hilfreich zu sein, um die Idee zu verstehen, das schaue ich mir noch genauer an. Vielen Dank.
Zitat:
Zitat von hall
|
Die Antwort ist grundsätzlich nicht falsch, geht aber an meiner Frage vorbei.
Aus der WSDL, die in diesem Falle etwas über 5 MB groß ist, die Objektstruktur zu entwickeln, stelle ich mir schon sehr mühsam vor. Zumal wenn man, wie ich, gerade mal den Einstieg in die Welt der Objekte finden will.
Vermutlich wird mir nichts anderes übrig bleiben, als für die recht begrenzten Teilbereiche, die in der WSDL beschrieben sind, den Baum von oben nach unten durchzugehen und mich dann von den Wurzeln wieder hochzuarbeiten.
Zitat:
Zitat von hall
schönen Feiertag zusammen
(von einem der schon ewig nicht mehr online war  )
|
Das Wochenende habe ich offline genossen. Danke.
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
Themen-Optionen |
|
Thema bewerten |
|
Forumregeln
|
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.
HTML-Code ist aus.
|
|
|
|
PHP News
|