php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger > PHP Tipps 2005

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 26.11.2004, 14:09  
Moderator
 
Benutzerbild von robo47
 
Registriert seit: 03.09.2004
Beiträge: 11.792
PHP-Kenntnisse:
Fortgeschritten
robo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz sein
Standard Einstellungsklasse

Ich fände es schön wenn sich mal ein paar Leute die Klasse anschauen und mir sagen würden, was man noch verbessern könnte, was vieleicht problematisch sein kann bzw ob Bugs in dieser Klasse sind. Und was auf andere Art vieleicht sinnvoller zu realisieren wäre.


Btw ist die Klasse free to use, sprich jeder kann sie gerne in seinen projekten verwenden, allerdigns übernehme ich keinerlei gewährlsitung für ihre Funktion und bin auch nicht haftbar zu machen für dadurch entstanden schaden. ( :P man muss das ja heutezutage lieber gleich dazusagen :P)

Zu meiner Todoliste die ich für die Erweiterung anstrebe bzw die zum teil in einer betaversion schon existieren:
- Version mit komplett englischen Kommentaren
- Möglichkeit Binärinhalte wie Bilder oder ähnlcihes in der Datei zu speichern (mittels base64_decode / base64_encode)
- Möglichkeit bestimmten Datentyp für ein Element zu erzwingen
- Möglichkeit Arrays zu speichern

PHP-Code:
<?
/**
* settings-Klasse
*
* Die Klasse ermöglicht es Einstellungen zu setzen, zu editieren und zu löschen und das alles
* in einer Datei, ohne eine zusätzliche Datei für die Einstellungen zu benötigen und das ganze bequem in einem Script.
*
* @author    Robo47 aka Benjamin Steininger <Robo47@dark-angles.de>
* @version    v 0.1a 6.11.2004
* @access    public
* @todo        möglichkeit implementieren binärinhalte zu speichern
*/
class settings    {
    
/**
    * Array für sämtliche Settings die erstellt werden
    *
    * Dieses Array beinhaltet alle Einstellungen die gemacht werden.
    *
    * @access    public
    * @var    array    $SC
    */
    
var $SC = array();
    
/**
    * Konstruktor der Klasse
    *
    * Hier werden sämtliche Werte der Klasse in der Variable $SC gesetzt
    *
    * @access    private
    */
    
function settings() {
/* 9c7d87fb61a561d8be313dc5be2fd821 */
/* 03a6a77d6384aac6d4e0ea5f9b5e7269 */
    
}
    
/**
    * Löscht Einstellungseinträge
    *
    * Löscht den jeweils über $name übergebenen Eintrag aus $SC und lässt über 
    * RewriteFile(); die Datei dann neu lesen
    * 
    * @since    v 0.1a
    * @author    Robo47 aka Benjamin Steininger <Robo47@dark-angles.de>
    * @access    public
    * @param    string    $name Name der Einstellung
    */
    
function DeleteSetting($name) {

        
// Löscht einen Einstellungseintrag anhand dem übergebenen Namen $name
        
if(!empty($name) AND isset($this->SC[$name])) {
            unset(
$this->SC[$name]);
        }
    }
    
/**
    * Verändert/Erstellt Einstellungseinträge
    * 
    * Erstellt bzw Verändert den jeweils über $name übergebenen Eintrag aus $SC mit dem 
    * Wert von $value und lässt über RewriteFile(); die Datei dann neu lesen
    *
    * @since    v 0.1a
    * @author    Robo47 aka Benjamin Steininger <Robo47@dark-angles.de>
    * @access    public
    * @param    string    $name Name der Einstellung
    * @param    string  $value Wert der Einstellung
    */
    
function ChangeSetting($name,$value) {
        
// Weißt dem Index $name des Arrays $SC den Wert $value zu und veränder oder 
        // erstellt damit einen neuen Einstellungseintrag
        
if(!empty($name)) {
            
$this->SC[$name] = addslashes($value);
        }
    }
    
/**
    * Gibt die Einstellungen der Klasse in einem Array zurück
    * 
    * Gibt alle in $SC definierten Variablen als Array zurück um sie im Programm 
    * weiterzuverarbeiten. 
    *
    * @since    v 0.1a
    * @author    Robo47 aka Benjamin Steininger <Robo47@dark-angles.de>
    * @access    public
    * @return    array    Array mit allen Einstellungen die in der Klasse definiert sind
    */
    
function GetSettings() {
        FOREACH(
$this->SC as $key=>$value) {
            
$returnvalue[$key] = stripslashes($value);
        }
        return 
$returnvalue;
    }
    
/**
    * Überprüfungsfunktion
    * 
    * ueberprüft und schreibt die Einzelnen Subvariablen
    *
    * @since    v 0.1a
    * @author    Robo47 aka Benjamin Steininger <Robo47@dark-angles.de>
    * @access    private
    */
    
function CheckItem($value,$elementnames,&$blub)
    {
        
$array FALSE;
        if(
is_array($value))
        {
            
// empty
        
}
        elseif(
is_string($value))
        {
            
$type '//String';
            
$value '\''.$value.'\'';
        }
        elseif(
is_integer($value))
        {
            
$type '//Integer';
        }    
        elseif(
is_float($value))
        {
            
$type '//Float';
        }            
        elseif(
is_bool($value))
        {
            
$type '//Boolean';
            if(
$value) {
                
$value 'TRUE';
            }else    {
                
$value 'FALSE';
            }
        }
        else
        {
            
$type '//Nothing';
            echo 
'Error while Saving Data. Element '.$elementnames[1].' is no supported Variabletype

'
;
        }
        IF(!
is_array($value))
        {
            
$elemennamesformatted '';
            FOREACH(
$elementnames as $arrayname)
            {
                
$elemennamesformatted .= '[\''.$arrayname.'\']';
            }
            
$blub[] = "\t\t".'$'.'this->SC'.$elemennamesformatted."\t\t".'= '.$value.';'."\t\t".$type."\r\n";                        
        }
        unset(
$array,$value,$elementnames,$elemennamesformatted,$arrayname,$value);
    }
    
/**
    * Schreibt die Einstellungen in die Datei
    * 
    * Die Funktion schreibt die Datei in der sich die Klasse befindet neu, um neue Einträge 
    * Veränderungen in den  Settings u übernehmen und sie somit allen Scripts zur Verfügung  zu 
    * stellen die auch auf die Klasse zugreifen
    *
    * @since    v 0.1a
    * @author    Robo47 aka Benjamin Steininger <Robo47@dark-angles.de>
    * @access    public
    */
    
function SaveSettings() {
        
        
// Liest die Datei selbst in ein Array ein, um die Teile vor und nach den Einstellungen zu Sichern und die neuen 
        // Einstellungseinträge dann in die Datei zu übernehmen
        
$ClassFile file(__FILE__);
        foreach(
$this->SC as $name=>$value) {
            
$this->CheckItem($value,array($name),$Part2);
        }
        
// Sucht die zwei durch Kommentare definierten Stellen im Code ab denen der Code im 
        // Anschluss getrennt wird
        
foreach($ClassFile as $Line=>$Content) {
            if(
eregi(md5('Settingsbereich'),$Content)) {
                
$Begin[] = $Line;
            }
            if(
eregi(md5('Settingsbereichende'),$Content)) {
                
$End[] = $Line;
            }        
        }
        
// Splittet die Datei in 2 Arrays auf, das Erste $Part1 mit den Zeilen der Datei die vor 
        // den Einstellungseinträgen stehen und in $Part3 ein Array in dem der Rest der Datei steht
        
foreach($ClassFile as $Line=>$Content) {
            if(
$Line $Begin[0]+1) {
                
$Part1[] = $Content;
            }
            if(
$Line $End[0]-1) {
                
$Part3[] = $Content;
            }        
        }
        unset(
$ClassFile);
        
// Fügt die Einzelnen Teile wieder zusammen
        
$CompleteFile array_merge($Part1,$Part2,$Part3);
        
// Öffnet die Datei um den Inhalt wieder hineinzuschreiben
        
$ClassFile fopen(__FILE__"w");
        
// Schreibt die Datei mit den neuen Einstellungseinträgen neu
        
foreach($CompleteFile as $Line) {
            
fputs($ClassFile$Line);
        }
        
fclose ($ClassFile);
    }
}


$Einstellungen = new settings();
$Einstellungen->ChangeSetting('name',25);
$Einstellungen->SaveSettings();
$Daten $Einstellungen->GetSettings();
print_r($Daten);
?>
MFG
Robo47
robo47 ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

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

Alt 26.11.2004, 14:42  
Gast
 
Beiträge: n/a
Standard

blos weil ich das grad gelesene hab .. beim drüberfliegen:
$type = '//Boolean';
if($value) {
$value = 'TRUE';

dann nimm doch bitte auch $value = TRUE; .. dann haste nen boolean und keinen string.
 
Alt 26.11.2004, 14:49  
Moderator
 
Benutzerbild von robo47
 
Registriert seit: 03.09.2004
Beiträge: 11.792
PHP-Kenntnisse:
Fortgeschritten
robo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz sein
Standard

wenn du die funktion weiter verfolgst wirst du feststellen, dass das auch passiert, ich aber einen string brauche, weil der dann in die Datei geschrieben wird.

hier wird value dann ausgegeben.

PHP-Code:
$blub[] = "\t\t".'$'.'this->SC'.$elemennamesformatted."\t\t".'= '.$value.';'."\t\t".$type."\r\n"
mfg
robo47
robo47 ist offline  
Alt 26.11.2004, 15:37  
Gast
 
Beiträge: n/a
Standard

ahja alles klar .. das hab ich türlich nich gesehen .. dann isset ja ok.
 
Alt 02.08.2005, 12:01  
Moderator
 
Benutzerbild von robo47
 
Registriert seit: 03.09.2004
Beiträge: 11.792
PHP-Kenntnisse:
Fortgeschritten
robo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz sein
Standard

Version 2.0
Ohne exportieren in Konstanten, aber dafür mit support für Arrays, Objekte, Klassen und binäre Daten.

PHP-Code:
<?php
error_reporting
(E_ALL);
/**
* settings-Klasse
*
* Die Klasse ermöglicht es Einstellungen zu setzen, zu editieren und zu löschen und das alles
* in einer Datei, ohne eine zusätzliche Datei für die Einstellungen zu benötigen und das ganze 
* bequem in einem Script. Ausserdem mitlerweile unterstützung von Arrays, Objekten sowie binären Daten
* Funktionsweise mit UTF-8-Daten oder ähnliches wurde noch nicht getestet.

* BeispielCode:
* $Einstellungen = new settings();
* $Einstellungen->ChangeSetting('test','wert');
* $Einstellungen->SaveSettings();
* $Daten = $Einstellungen->GetSettings();
* print_r($Daten);
*
* @author    Robo47 aka Benjamin Steininger <Robo47@robo47.net>
* @version    v 2.0 15.07.2005
* @access    public
*/
class settings
{
    
/**
    * Array für sämtliche Settings die erstellt werden
    *
    * Dieses Array beinhaltet alle Einstellungen die gemacht werden.
    *
    * @access    public
    * @var        array    $SC
    */
    
private $SC = array();
    
/**
    * Konstruktor der Klasse
    *
    * Hier werden sämtliche Werte der Klasse in der Variable $SC gesetzt
    *
    * @access    private
    */
    
public function __construct()
    {
/* 9c7d87fb61a561d8be313dc5be2fd821 */
        
$this->SC['test']        = 'czo0OiJ3ZXJ0Ijs=';
/* 03a6a77d6384aac6d4e0ea5f9b5e7269 */
    
}
    
/**
    * Löscht Einstellungseinträge
    *
    * Löscht den jeweils über $name übergebenen Eintrag aus $SC und lässt über
    * RewriteFile(); die Datei dann neu lesen
    *
    * @since    v 0.1a
    * @author    Robo47 aka Benjamin Steininger <Robo47@dark-angles.de>
    * @access    public
    * @param    string    $name Name der Einstellung
    */
    
public function DeleteSetting($name)
    {
        if(!
is_string($name))
        {
            
trigger_error('$name is expected to be string, but is '.gettype($path).' on '.__class__.'::'.__function__,E_USER_NOTICE);
        }
        if(empty(
$name))
        {
            
trigger_error('$name is empty on '.__class__.'::'.__function__,E_USER_NOTICE);
        }
        
// Löscht einen Einstellungseintrag anhand dem übergebenen Namen $name
        
if(!empty($name) AND isset($this->SC[$name]))
        {
            unset(
$this->SC[$name]);
        }
    }
    
/**
    * Verändert/Erstellt Einstellungseinträge
    *
    * Erstellt bzw Verändert den jeweils über $name übergebenen Eintrag aus $SC mit dem
    * Wert von $value und lässt über RewriteFile(); die Datei dann neu lesen
    *
    * @since    v 0.1a
    * @author    Robo47 aka Benjamin Steininger <Robo47@dark-angles.de>
    * @access    public
    * @param    string    $name Name der Einstellung
    * @param    string    $value Wert der Einstellung
    * @version    v 2.0 15.07.05
    */
    
public function ChangeSetting($name,$value)
    {
        if(!
is_string($name))
        {
            
trigger_error('$name is expected to be string, but is '.gettype($path).' on '.__class__.'::'.__function__,E_USER_NOTICE);
        }
        elseif(!
is_string($value) and !is_int($value) and !is_float($value) and !is_bool($value))
        {
            
trigger_error('$value is expected to be string, int, float or bool, but is '.gettype($path).' on '.__class__.'::'.__function__,E_USER_NOTICE);
        }
        elseif(empty(
$name))
        {
            
trigger_error('$name is empty on '.__class__.'::'.__function__,E_USER_NOTICE);
        }
        else
        {
            
// Weißt dem Index $name des Arrays $SC den Wert $value zu und veränder oder
            // erstellt damit einen neuen Einstellungseintrag
            
$this->SC[$name] = base64_encode(serialize($value));
        }
    }
    
/**
    * Gibt die Einstellungen der Klasse in einem Array zurück
    *
    * Gibt alle in $SC definierten Variablen als Array zurück um sie im Programm
    * weiterzuverarbeiten.
    *
    * @since    v 0.1a
    * @author    Robo47 aka Benjamin Steininger <Robo47@dark-angles.de>
    * @access    public
    * @return    array    Array mit allen Einstellungen die in der Klasse definiert sind
    * @version    v 2.0 15.07.05
    */
    
public function GetSettings()
    {
        foreach(
$this->SC as $key=>$value)
        {
            
$returnvalue[$key] = unserialize(base64_decode($value));
        }
        return 
$returnvalue;
    }
    
/**
    * Überprüfungsfunktion
    *
    * ueberprüft und schreibt die Einzelnen Subvariablen
    *
    * @since    v 2.0 15.07.05
    * @author    Robo47 aka Benjamin Steininger <Robo47@dark-angles.de>
    * @access    private
    * @version    v 2.0 15.07.05
    */
    
private function SaveItem($value,$elementnames,&$FileContent)
    {
        
$FileContent[] = "\t\t".'$'.'this->SC[\''.$elementnames.'\']'."\t\t".'= \''.addslashes($value)."';\n";

    }
    
/**
    * Schreibt die Einstellungen in die Datei
    *
    * Die Funktion schreibt die Datei in der sich die Klasse befindet neu, um neue Einträge
    * Veränderungen in den  Settings u übernehmen und sie somit allen Scripts zur Verfügung  zu
    * stellen die auch auf die Klasse zugreifen
    *
    * @since    v 0.1a
    * @author    Robo47 aka Benjamin Steininger <Robo47@dark-angles.de>
    * @access    public
    * @version    v 2.0 15.07.05
    */
    
public function SaveSettings()
    {
        
// Liest die Datei selbst in ein Array ein, um die Teile vor und nach den Einstellungen zu Sichern und die neuen
        // Einstellungseinträge dann in die Datei zu übernehmen
        
$ClassFile file(__FILE__);
        
$Part2 '';
        foreach(
$this->SC as $name=>$value)
        {
            
$this->SaveItem($value,$name,$Part2);
        }
        
// Sucht die zwei durch Kommentare definierten Stellen im Code ab denen der Code im
        // Anschluss getrennt wird
        
foreach($ClassFile as $Line=>$Content)
        {
            if(
eregi(md5('Settingsbereich'),$Content))
            {
                
$Begin[] = $Line;
            }
            if(
eregi(md5('Settingsbereichende'),$Content))
            {
                
$End[] = $Line;
            }
        }
        
// Splittet die Datei in 2 Arrays auf, das Erste $Part1 mit den Zeilen der Datei die vor
        // den Einstellungseinträgen stehen und in $Part3 ein Array in dem der Rest der Datei steht
        
foreach($ClassFile as $Line=>$Content)
        {
            if(
$Line $Begin[0]+1)
            {
                
$Part1[] = $Content;
            }
            if(
$Line $End[0]-1)
            {
                
$Part3[] = $Content;
            }
        }
        unset(
$ClassFile);
        
// Fügt die Einzelnen Teile wieder zusammen
        
$CompleteFile array_merge($Part1,$Part2,$Part3);
        
// Öffnet die Datei um den Inhalt wieder hineinzuschreiben
        
$ClassFile fopen(__FILE__"w");
        
// Schreibt die Datei mit den neuen Einstellungseinträgen neu
        
foreach($CompleteFile as $Line)
        {
            
fputs($ClassFile$Line);
        }
        
fclose ($ClassFile);
    }
}
?>
php5 !

wollts nur mal hier reinstellen weils ne neue version gibt

Tips, Kritiken, Vorschläge zur Verbesserung und so werden immer gerne gesehen.

mfg
robo47
robo47 ist offline  
Alt 02.08.2005, 13:08  
axo
Erfahrener Benutzer
 
Registriert seit: 24.12.2004
Beiträge: 1.814
axo ist zur Zeit noch ein unbeschriebenes Blatt
Standard

puh... und was ist mit PEAR::Config?

und von 'sich selbst modifizierendem code zur laufzeit' halte ich persönlich gar nichts. es hat schon seinen sinn, die konfigurations-optionen in einem eigenen file abzulegen. nimm als beispiel nur die update-fähigkeit: was passiert, wenn du irgendwo version 2.341 deiner settings-klasse installiert hast, und ein update auf eine neue version machst? einfaches austauschen der klassendatei ist dann nicht mehr - weil die membervariablen bei jeder 'installation' anders sind.
normalerweise macht man das 'setzen' der membervariablen entweder im konstruktor oder mit einer zusätzlichen init() - methode.

das 'switchen' der konfiguration fällt dann auch flach - du musst eine komplette klasse austauschen, um eine andere konfiguration zu haben.

die schnittstelle der klasse verändert sich permanent bzw. hast du nie eine garantierte schnittstelle - was die wiederverwendbarkeit und erweiterbarkeit der klasse einschränkt ...

und und und...

übrigens ist ein unterschied anzumerken zwischen sich 'zur laufzeit selbst modifizierendem code' und 'zur compilezeit modifizierendem code' - mit dem gedanken an 'generative programmierung' macht es durchaus sinn, vor der auslieferung von skripten an den kunden diverse 'optimierungen' direkt in den code zu schreiben, um z.b. die performance zu erhöhen, ohne beim entwickeln unleserlichen code warten zu müssen, oder um die variabilität des codes ohne laufzeitverluste hoch zu halten. das hat auch mit selbst modifizierendem code zu tun, hat aber andere ziele.

insgesamt halte ich deine klasse zwar für schön dokumentiert (auch wenn ich persönlich auf kommentare auf englisch bestehe) und für einen netten versuch, aber für nicht wiederverwendbar und vom ansatz her problematisch.

grüße
axo
axo ist offline  
Alt 02.08.2005, 13:13  
Erfahrener Benutzer
 
Registriert seit: 30.07.2005
Beiträge: 142
jesus666
Standard

ich würd das auch nicht im anfängerforum posten.
jesus666 ist offline  
Alt 02.08.2005, 13:14  
Erfahrener Benutzer
 
Registriert seit: 14.01.2004
Beiträge: 2.543
fantast
fantast eine Nachricht über ICQ schicken
Standard

Wo ist RestoreSettings() ?

und Klassen schreibt man so: Settings und funktionen dafuer so: getSettings()
__________________
Was ist validität?
fantast ist offline  
Alt 02.08.2005, 13:19  
Gast
 
Beiträge: n/a
Standard

Zitat:
Zitat von jesus666
ich würd das auch nicht im anfängerforum posten.
Du nicht. <ggg>

btw: es gibt Hochstapler und Tiefstapler...
 
Alt 02.08.2005, 13:20  
Moderator
 
Benutzerbild von robo47
 
Registriert seit: 03.09.2004
Beiträge: 11.792
PHP-Kenntnisse:
Fortgeschritten
robo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz sein
Standard

klar zwischen version 1.0 und 2.0 herrscht ein großer unterschied die sind nicht zueinander kompatibel, mir ging es bei der klasse drum, das ganze in einer Datei zu realisieren ohne auf weitere dateien angewiesen sein

naja da ich ein projekt momentan habe wo ich alles in einer datei haben will geht an sowas halt kein weg vorbei.

PEAR:Config kannte ich nicht, werde ich mir aber auf jeden fall mal anschauen.

*Ausrede*
Englische kommentare hab ich meistens, da aber das Script auch noch woanders zum Einsatz kommt, wurde ich geben es auch in Deutsch zu kommentieren und so ist v2 bis jetzt nur in Deutsch kommentiert

Vielen Dank mal für die Kritik

mfg
robo47
robo47 ist offline  
 


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

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
php trigger_error eigene konstante e_user_notice

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