php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > PHP Developer Forum
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


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.

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1 (permalink)  
Alt 29-05-2012, 18:45
gernea
 Registrierter Benutzer
Links : Onlinestatus : gernea ist offline
Registriert seit: May 2012
Beiträge: 5
gernea befindet sich auf einem aufstrebenden Ast
Standard Ressourcenschonung in PHP Objekten

Hallo,

verständnissfrage, ist es grundsätzlich schonender in einer beliebigen Class eine bereits deklarierte globale Class über ( global $var ), zuzuladen oder diese neu zu laden ( $var = new xyz; )? Meinungen?

Grüße
Mit Zitat antworten
  #2 (permalink)  
Alt 29-05-2012, 19:00
h3ll
 Registrierter Benutzer
Links : Onlinestatus : h3ll ist offline
Registriert seit: Mar 2008
Beiträge: 3.593
h3ll befindet sich auf einem aufstrebenden Ast
Standard

Diese Frage ergibt keinen Sinn.

1. global ist generell böse und zu vermeiden.

2. Brauchst du jedesmal ein anderes Objekt, dann new.

3. Brauchst du immer das selbe Objekt, dann einmalig erstellen und an die jeweilige Funktion, die sie benötigt, übergeben.

Die Antwort ergibt sich also aus der Anforderung (die du nicht genannt hast).
Mit Zitat antworten
  #3 (permalink)  
Alt 29-05-2012, 20:08
gernea
 Registrierter Benutzer
Links : Onlinestatus : gernea ist offline
Registriert seit: May 2012
Beiträge: 5
gernea befindet sich auf einem aufstrebenden Ast
Standard

Auf den ersten Blick sinvoller Zusammenhang, vieleicht eher eine Frage der Angehensweise.

Wenn du zu Beginn deines Scriptes eine class mit function's gerufen hast die z.B. parameter sammelt oder den nutzer klassifiziert, abgelegt z.B. in der globalen $save. Wenn ich nun in späteren zusammenhängen Zugriff auf diese parameter benötige ist es doch am einfachsten diese global zuzuladen, als diese durch jede function zu schleifen bzw. die daten durch neuanlage erneut zu sammeln... Andere idee hierzu?
Mit Zitat antworten
  #4 (permalink)  
Alt 29-05-2012, 20:17
combie
 PHP Expert
Links : Onlinestatus : combie ist offline
Registriert seit: May 2006
Beiträge: 3.296
combie wird schon bald berühmt werden
Standard

Auch in der OOP gibt es "statische" Dinge. Ein "global" ist da nun wirklich nicht nötig. Auch ist es böse, wie mein Vorredner schon sagte.

Zitat:
die daten durch neuanlage erneut zu sammeln...
Das ist auch böse.



Zitat:
Andere idee hierzu?
Bei den "PHP OOP Design Pattern" wirst du sicherlich fündig. Wobei ich dir aber direkt vom "Singleton Design Pattern" abraten möchte. Es hat, mehr oder weniger, die gleiche Neigung unerwünschte Seiteneffekte zu fördern, wie "global".
__________________
Wir werden alle sterben
Mit Zitat antworten
  #5 (permalink)  
Alt 29-05-2012, 22:58
h3ll
 Registrierter Benutzer
Links : Onlinestatus : h3ll ist offline
Registriert seit: Mar 2008
Beiträge: 3.593
h3ll befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von gernea Beitrag anzeigen
Wenn du zu Beginn deines Scriptes eine class mit function's gerufen hast die z.B. parameter sammelt oder den nutzer klassifiziert, abgelegt z.B. in der globalen $save.
global ist böse. Habe ich bereits gesagt und hat bei der OOP-Programmierung nichts verloren.

Zitat:
Zitat von gernea Beitrag anzeigen
Wenn ich nun in späteren zusammenhängen Zugriff auf diese parameter benötige ist es doch am einfachsten diese global zuzuladen, als diese durch jede function zu schleifen bzw. die daten durch neuanlage erneut zu sammeln...
Dem ersten Anschein nach vielleicht. Aber später wirst du dich einmal hassen dafür.

Zitat:
Zitat von gernea Beitrag anzeigen
Andere idee hierzu?
Dependency Injection
Mit Zitat antworten
  #6 (permalink)  
Alt 30-05-2012, 10:35
gernea
 Registrierter Benutzer
Links : Onlinestatus : gernea ist offline
Registriert seit: May 2012
Beiträge: 5
gernea befindet sich auf einem aufstrebenden Ast
Standard

Klingt vernünftig, habe ein kleines Beispiel gebaut, hintergund ist das ich z.B. die class log an verschiedenen stellen mit daten versorgen / beziehen möchte, geht das anders besser?

PHP-Code:
class Log
    
{
    public 
$book;
    function 
__construct($str)
        {
        
$this->SetLog($str);
        }
    
    public function 
GetLog()
        {
        echo 
$this->book;
        }
        
    public function 
SetLog($str)
        {
        
$this->book .= $str."<br>";
        }
    }

class 
Wohnung
    
{
    private 
$Street;
    protected function 
SetStreet($str)
        {
        
$this->Street $str;
        }
    
    protected function 
GetStreet()
        {
        return 
$this->Street;
        }
    }

class 
Zimmer extends Wohnung
    
{
    function 
__construct(Log $log)
        {
        
$this->log $log;
        }
    
    public function 
Einzug()
        {
        
Wohnung::SetStreet('Humboldstr');
        
$this->log->SetLog('Set a Street');
        }
    
    public function 
Visitenkarte()
        {
        echo 
$this->GetStreet();
        
$this->log->SetLog('Get a Street');
        }
    
    }

$log = new Log('Start');
    
$wohnen = new Zimmer($log);
$wohnen->Einzug();
$wohnen->Visitenkarte();

$log->GetLog(); 
Mit Zitat antworten
  #7 (permalink)  
Alt 30-05-2012, 11:00
Benutzerbild von mermshaus mermshaus
 Registrierter Benutzer
Links : Onlinestatus : mermshaus ist offline
Registriert seit: Jun 2009
Beiträge: 451
mermshaus wird schon bald berühmt werden
Standard

Hm, ich frage mich, warum du da die Vererbung drin hast, also worum es dir mit diesem Beispiel genau geht?

Die Art und Weise der Übergabe des Loggers für sich betrachtet, also die Zuweisung im Konstruktor, ist so aber durchaus sinnvoll, ja.
Mit Zitat antworten
  #8 (permalink)  
Alt 30-05-2012, 11:08
h3ll
 Registrierter Benutzer
Links : Onlinestatus : h3ll ist offline
Registriert seit: Mar 2008
Beiträge: 3.593
h3ll befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von gernea Beitrag anzeigen
geht das anders besser?
http://flow3.typo3.org/documentation...ogramming.html
Mit Zitat antworten
  #9 (permalink)  
Alt 31-05-2012, 10:42
gernea
 Registrierter Benutzer
Links : Onlinestatus : gernea ist offline
Registriert seit: May 2012
Beiträge: 5
gernea befindet sich auf einem aufstrebenden Ast
Standard

Also wenn wir das zusammenfassen, sollte Ziel sein alle Var's über die Abläufe zuzuladen und ergebnisse zu returen, keine Globalen.

1.) Wie haltet Ihr es mit $_POST, $_GET und $_SESSION, ist es auch sinvoll diese nur nach bedarf zuzuladen ganz/einzelteile oder globaler Abgriff in der Class?

2.) Schleift Ihr den $MYSQLI nach erfolgreicher Connection auch durch den ablauf zu jedem Punkt an dem dieser benötigt wird?
Mit Zitat antworten
  #10 (permalink)  
Alt 31-05-2012, 10:52
h3ll
 Registrierter Benutzer
Links : Onlinestatus : h3ll ist offline
Registriert seit: Mar 2008
Beiträge: 3.593
h3ll befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von gernea Beitrag anzeigen
1.) Wie haltet Ihr es mit $_POST, $_GET und $_SESSION, ist es auch sinvoll diese nur nach bedarf zuzuladen ganz/einzelteile oder globaler Abgriff in der Class?
Schau dir mal das Zend Framework als Beispiel an.

GET- und POST-Parameter stehen hier im Zend_Request. Und die Session wird über Zend_Session abgehandelt.

Globaler Zugriff ist zu vermeiden, weil es sonst die Testbarkeit und Modularität behindert.

Zitat:
Zitat von gernea Beitrag anzeigen
2.) Schleift Ihr den $MYSQLI nach erfolgreicher Connection auch durch den ablauf zu jedem Punkt an dem dieser benötigt wird?
Ja. Aber so viele Stellen sind das nicht. Es sollte nur die Persistenzschicht Zugriff auf die Datenbankverbindung haben. Die Domänen- und Präsentationsschicht haben damit nix am Hut.
Mit Zitat antworten
  #11 (permalink)  
Alt 31-05-2012, 12:57
Benutzerbild von mermshaus mermshaus
 Registrierter Benutzer
Links : Onlinestatus : mermshaus ist offline
Registriert seit: Jun 2009
Beiträge: 451
mermshaus wird schon bald berühmt werden
Standard

Zitat:
Zitat von h3ll
Ja. Aber so viele Stellen sind das nicht. Es sollte nur die Persistenzschicht Zugriff auf die Datenbankverbindung haben. Die Domänen- und Präsentationsschicht haben damit nix am Hut.
Ja. „Durchschleifen“ klingt immer so, als würde man irgendeinen Ballast, der allgemein absolut nichts mit der Teilkomponente zu tun hat, über 20 geschachtelte Methodenaufrufe weiterreichen.

Ich glaube, das ist mehr ein latentes Empfinden als ein tatsächliches Problem. Oder der Fehler liegt eben bereits im Design, auch wenn das jetzt natürlich einfach gesagt ist.

Die Vorstellung sollte eher so gehen: Wenn ich ein Objekt irgendwo innerhalb einer Teilkomponente benötige, hängt die gesamte Teilkomponente von diesem Objekt ab.[1]

Global state ist prinzipiell zu vermeiden (dazu zählen auch Singletons, Registries, für mich auch (statische) Klassenvariablen). Der new-Operator sollte nach Möglichkeit nur in dedizierten Fabrikmethoden auftauchen.

So was ist aber glaube ich nur sinnvoll an echten Beispielen zu diskutieren. Falls da jemand was hat, bei dem etwa das Problem des Durchschleifens besteht, sehr gerne.



1: Meiner Erfahrung nach hat Code da die Angewohnheit, sich selbst zu organisieren. Wenn dir bei der Programmierung irgendwas unsauber vorkommt, ist es zumeist auch unsauber. Bei mir wird das meist darin offensichtlich, dass ein Objekt etwas kann, auf das ich an einer Stelle, an der ich das Objekt nutze, keinen Zugriff gestatten will. Das ist in der Regel ein Anzeichen dafür, dass mein Objekt zu viel tut und ich ein weiteres Objekt einführen sollte, um Teilfunktionalität zu kapseln, oder dass ich ein Objekt von zu weit oben in der Objekthierarchie übergeben habe. Wenn ich nur Zugriff auf den Logger haben möchte, brauche ich etwa nicht die gesamte Anwendung zu übergeben (Gesetz von Demeter).
Mit Zitat antworten
  #12 (permalink)  
Alt 31-05-2012, 13:34
unset
  Moderator
Links : Onlinestatus : unset ist offline
Registriert seit: Jan 2007
Ort: Düsseldorf
Beiträge: 3.782
unset befindet sich auf einem aufstrebenden Ast
Standard

"Statische" Klassenvariablen (eigentlich meine ich Konstanten) braucht man alleine deswegen schon, um "magic numbers" zu vermeiden. Status-Codes, bestimmte Zustände und andere Dinge, die numerisch abgebildet werden, brauchen zwangsläufig eine "menschenlesbare" Repräsentation. Ansonsten stimme ich dir aber weitestgehend zu.
Mit Zitat antworten
  #13 (permalink)  
Alt 03-06-2012, 11:09
gernea
 Registrierter Benutzer
Links : Onlinestatus : gernea ist offline
Registriert seit: May 2012
Beiträge: 5
gernea befindet sich auf einem aufstrebenden Ast
Standard static?

Somit dann die Frage in welchen situationen man eher auf static functions zurückgreift, rein von dem was an code im netz zu finden ist werden abwicklungen von sessions und mysql oft über static gelöst, mal abesehen davon das es keine $this deklaration in static gibt?

Ergebnisse wärn hier die gleichen... Argumente?
PHP-Code:
class var1
    
{
    public static 
$val = array();
    
    public static function 
get($key)
        {
        return 
self::$val[$key];
        }
    public static function 
set($key$val)
        {
        
self::$val[$key] = $val;
        }    
    }

class 
var2
    
{
    public 
$val = array();
    
    public function 
get($key)
        {
        return 
$this->val[$key];
        }
    public function 
set($key$val)
        {
        
$this->val[$key] = $val;
        }    
    }

var1::set("Auto""Ford");
echo 
var1::get("Auto");

$var2 = new var2();
$var2->set("Auto""Ford");
echo 
$var2->get("Auto"); 

Geändert von gernea (03-06-2012 um 19:30 Uhr)
Mit Zitat antworten
  #14 (permalink)  
Alt 03-06-2012, 23:49
Benutzerbild von mermshaus mermshaus
 Registrierter Benutzer
Links : Onlinestatus : mermshaus ist offline
Registriert seit: Jun 2009
Beiträge: 451
mermshaus wird schon bald berühmt werden
Standard

So eine statische Klasse ist wenig mehr als einige globale Variablen und Funktionen, die in einem Namespace (dem Klassennamen) zusammengefasst werden.

Es existieren keine Instanzen der Klasse. Wenn du mich fragst, ist das eigentlich auch keine Objektorientierung.
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
setTimeout in Objekten Kropff HTML, JavaScript, AJAX, jQuery, CSS, Bootstrap, LESS 17 17-06-2009 02:46
private Methoden in Literal-Objekten Kropff HTML, JavaScript, AJAX, jQuery, CSS, Bootstrap, LESS 13 16-05-2009 16:38
Existenz von Objekten Dani Düsentrieb PHP Developer Forum 7 10-02-2009 14:31
Typen von Objekten in JS PHP-Desaster HTML, JavaScript, AJAX, jQuery, CSS, Bootstrap, LESS 5 17-11-2006 19:16
Schleife mit DB Objekten Nebeneinander jetrider2k PHP Developer Forum 1 18-10-2004 10:45

Themen-Optionen
Thema bewerten
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.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an


PHP News

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

ADSMAN V3 - Werbe-Manager ansehen ADSMAN V3 - Werbe-Manager

ADSMAN V3 - mehr als nur ein Bannermanager! Banner, Textanzeigen und PagePeel Manager! Mit ADSMAN PRO haben Sie die Marketinglösung für eine effektive und effiziente Werbeschaltung mit messbaren Ergebnissen. Unterstützt werden Bannerformate in beliebi

25.10.2018 virtualsystem | Kategorie: PHP/ Bannerverwaltung
PHP News und Artikel Script V2

News schreiben, verwalten, veröffentlichen. Dies ist jetzt mit dem neuen PHP News & Artikel System von virtualsystem.de noch einfacher. Die integrierte Multi-User-Funktion und der WYSIWYG-Editor (MS-Office ähnliche Bedienung) ermöglichen...

25.10.2018 virtualsystem | Kategorie: PHP/ News
Top-Side Guestbook

Gästebuch auf Textbasis (kein MySQL nötig) mit Smilies, Ip Sperre (Zeit selbst einstellbar), Spamschutz, Captcha (Code-Eingabe), BB-Code, Hitcounter, Löschfunktion, Editierfunktion, Kommentarfunktion, Kürzung langer Wörter, Seiten- bzw. Blätterfunktion, V

22.10.2018 webmaster10 | Kategorie: PHP/ Gaestebuch
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 01:21 Uhr.