php.de

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

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 11.03.2007, 13:54  
Erfahrener Benutzer
 
Registriert seit: 16.02.2006
Beiträge: 303
tinchen
Standard OOP: In einer Klasse nur vars mit bestimmtem Präfix holen

Hallo ihr,

kann man in einer Klasse sich nur die Variablen holen, die einen
bestimmten Präfix haben?

PHP-Code:
class meineKlasse {
   var 
$id              NULL;
   var 
$config_user  NULL;
   var 
$config_pw    NULL;

   
// array 
   
function check() {
      
//Hier möchte ich eigentlich nur alle vars mit config_
      // so in etwa? 
      
$vars array_keysget_class_varsget_class$this ) ) );
      
//....
  
}
}
?> 
Kann man also nur die vars mit dem Präfix config_ bekommen?
Oder muss man das dann mit einem if else zweig in einem foreach
unterscheiden?

Grüße
Tine
tinchen ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

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

Alt 11.03.2007, 14:27  
Erfahrener Benutzer
 
Registriert seit: 13.08.2007
Beiträge: 1.976
KingCrunch befindet sich auf einem aufstrebenden Ast
KingCrunch eine Nachricht über ICQ schicken KingCrunch eine Nachricht über AIM schicken KingCrunch eine Nachricht über MSN schicken KingCrunch eine Nachricht über Yahoo! schicken
Standard

Einfacher wärs, wenn du gleich nen Array verwendest ^^

Ansonsten: Ansatz is gut, bloss wieso array_keys?
PHP-Code:
$vars get_class_vars get_class($this));
$temp = array();
foreach (
$vars as $var) {
  if (
substr ($var,0,7) === 'config_') {
    
$temp[] = $var;
  }
}
$vars $temp
Müsste eigentlich gehn

Zwei Sachen trotzdem noch:
1. Ich weiß nicht, ob get_class_vars auch ein Objekt erlaubt. Wenn das so ist, kannst du auf get_class verzichten.
2. Ich weiß ebenfalls nicht, ob get_class_vars nur die reinen Bezeichner zurück gibt, oder ob noch das Dollar $ davor steht. Wenn zweiteres, dann musst du die Zeile mit substr noch anpassen (8 statt 7 als Parameter und Dollar $ vors config_)
__________________
Nicht jeder Fehler ist ein Bug.
KingCrunch ist offline  
Alt 11.03.2007, 14:51  
Erfahrener Benutzer
 
Registriert seit: 16.02.2006
Beiträge: 303
tinchen
Standard

Hmm...

Also
PHP-Code:
$vars     array_keysget_class_varsget_class$this ) ) ); ?> 
ist schon richtig, ich möchte ja die Namen der vars und nicht die Inhalte.
Also get_class_vars( get_class( $this ) ) gibt ein leeres Array zurück, weil
ja alle vars mit NULL belegt sind.

Ich hatte erst gedacht da gibt es etwas spezielles dafür, aber so ist es auch ok.
Draus gemacht hab ich das.

PHP-Code:
function getKeysByPrefix($prefix=''$start_sub=0) {
    
$vars             array_keysget_class_varsget_class$this ) ) ); 
    
$prefix_length          strlen($prefix);
    
$prefix         strtolower(trim($prefix));
    if(
$prefix_length==0){
        return;
    } else {
        if(
is_array($vars)) {
            
$keys = array();
            foreach (
$vars as $v) {
                if ( 
substr($v$start_sub$prefix_length ) === $prefix ) {
                    
$keys[] = $v;
                }
            }
            return 
$keys;
        }    
    }
}
?> 
Grüße und Danke
Tine
tinchen ist offline  
Alt 11.03.2007, 16:05  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 34.255
PHP-Kenntnisse:
Fortgeschritten
nikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz sein
Standard

Bei Deiner Lösung würde ich einmalig einen Index erstellen, damit das ganze Prozedere nicht bei jeder Zuweisung abgespult werden muß.
Einfacher wär es allerdings, wenn du bei der Initialisierung das Prefix nicht verwndest und es erst zur internen Speicherung in der Klasse hinzufügst. Dann ist der Test viel einfacher.
Bsp (ungetestet)
PHP-Code:
class DoAnything
  
{
  var 
$config_what;
  var 
$config_that;
  var 
$that;

  function 
checkConfig($sName
    {
    
$aVars array_keysget_class_varsget_class$this )));
    return (
in_array ($sName $aVars))
    }

  
// aller über Init() initialisierten Werte erhalten das Prefix
  // config_ und müssen Klassenattribute sein
  
function Init ($sName $mValue)
    {
    
$sName 'config_' $sName;
    if (!
$this->checkConfig($sName) return false;

    
$this->$sName $mValue;
    }
  }

$DA = new DoAnything;
$DA->Init ('what' 1);     // erfolgreich
$DA->Init ('that' 'abc'); // erfolgreich, überschreibt nicht $obj->that
$DA->Init ('else' 'cde'); // schlägt fehl 
gruß --n
nikosch ist offline  
Alt 11.03.2007, 16:46  
Erfahrener Benutzer
 
Registriert seit: 16.02.2006
Beiträge: 303
tinchen
Standard

Der Präfix unterteil in der Klasse die Vars in Gruppen.
Ich möchte gezielt untersuchen welche Daten gespeichert werden.
Die Prozedur sieht ganz ungefähr so aus.

PHP-Code:
class meineKlasse extends dbTable {

   var 
$id                NULL;
   var 
$config_user  NULL;
   var 
$config_pw    NULL;

   function 
meineKlasse  ( &$db ) {
      
$this->dbTable'user_config''id'$db );
   }

   function 
bind$array$ignore='' ) {
    if (!
is_array$array )) {
        
$this->_error strtolower(get_class$this )).'error';
        return 
false;
    } else {
        return 
bindArrayToObject$array$this$ignore );
    }
   }

   function 
getKeysByPrefix($prefix=''$start_sub=0) {
    
$vars             array_keysget_class_varsget_class$this ) ) ); 
    
$prefix_length     strlen($prefix);
    
$prefix         strtolower(trim($prefix));
    if(
$prefix_length==0){
        return;
    } else {
        if(
is_array($vars)) {
            
$keys = array();
            foreach (
$vars as $v) {
                if ( 
substr($v$start_sub$prefix_length ) === $prefix ) {
                    
$keys[] = $v;
                }
            }
            return 
$keys;
        }    
    }
    }


   function 
check() {
   
$vars $this->getKeysByPrefix($prefix='config_');
    foreach(
$vars as $var) {
        if ( 
$this->$var != && $this->$var != ) {
            
$this->_error 'error:  '$var;
            return 
false;
        }
    }
    }


?> 
Und von außen regelt bindArrayToObject, dass keine fremden vars eingeschleust werden können. In der Funktion bind in der der Klasse wird $_POST eingegeben.
PHP-Code:
function bindArrayToObject$array, &$obj$ignore=''$prefix=NULL$checkSlashes=true ) {
    if (!
is_array$array ) || !is_object$obj )) {
        return (
false);
    }

    foreach (
get_object_vars($obj) as $k => $v) {
        if( 
substr$k0) != '_' ) { // internal attributes of an object are ignored
            
if (strpos$ignore$k) === false) {
                if (
$prefix) {
                    
$ak $prefix $k;
                } else {
                    
$ak $k;
                }
                if (isset(
$array[$ak])) {
                    
$obj->$k = ($checkSlashes && get_magic_quotes_gpc()) ? stripslashesArray$array[$ak] ) : $array[$ak];
                }
            }
        }
    }

    return 
true;

So aus dem Nichts ist das bestimmt schon nicht ohne. :wink:

Gruß
Tine
tinchen ist offline  
Alt 11.03.2007, 17:06  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

So ganz verstehe ich nicht was du machen möchtest, aber wenn du wirklich nur eine Gruppe von Variablen betrachten möchtest, solltest du die Gruppierung in der Klasse gleich durch Arrays umsetzen.

Zitat:
Zitat von KingCrunch
Einfacher wärs, wenn du gleich nen Array verwendest ^^
Eben. Ein config-Array läßt sich ja, falls Bedarf besteht, selbst nocheinmal schachteln.
Zergling-new ist offline  
Alt 11.03.2007, 17:15  
Erfahrener Benutzer
 
Registriert seit: 16.02.2006
Beiträge: 303
tinchen
Standard

Das Problem dabei dürfte sein, dass die Datenbank Klasse das nicht zulässt. Die DB Klasse holt sich die Vars ja aus der Klasse und wenn ich die
Vars nun in ein Array packe glaube ich nicht, dass das noch läuft, oder irre ich?

Gruß
Tine
tinchen ist offline  
Alt 11.03.2007, 17:26  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

Die Datenbank-Klasse hat doch damit nichts zutun, die bekommt im Optimal-Fall ja sowieso nicht mit, wie die Klasse ihre Daten organisiert.
Zergling-new ist offline  
Alt 14.03.2007, 09:55  
Neuer Benutzer
 
Registriert seit: 07.09.2006
Beiträge: 24
Ticos
Standard

Hallo tinchen,

eine kleine Anmerkung, die nicht zum Thema passt:
Objekte werden in PHP5 automatisch als Referenz übergeben. das (..& $oDB..)
kann man sich also sparen.

Gruß!
Ticos ist offline  
Alt 14.03.2007, 15:17  
Erfahrener Benutzer
 
Registriert seit: 13.08.2007
Beiträge: 1.976
KingCrunch befindet sich auf einem aufstrebenden Ast
KingCrunch eine Nachricht über ICQ schicken KingCrunch eine Nachricht über AIM schicken KingCrunch eine Nachricht über MSN schicken KingCrunch eine Nachricht über Yahoo! schicken
Standard

Das ganze Script sind aber nicht nach PHP5 aus
__________________
Nicht jeder Fehler ist ein Bug.
KingCrunch 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

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Variable aus Klasse herausbekommen GSJLink PHP Tipps 2008 7 16.02.2008 22:25
String-Parser Klasse - was muss rein? Matze PHP Tipps 2007 2 08.04.2007 22:14
mehr als eine Klasse einbinden Alpha Centauri PHP-Fortgeschrittene 4 13.04.2006 20:56
Instanz einer Klasse in einer anderen Klasse verwenden Buhmann PHP-Fortgeschrittene 7 28.10.2005 23:12
Klasse holt sich die Klasse PHP-Fortgeschrittene 9 07.10.2004 11:53
Klasse ändern UniQ PHP Tipps 2004 5 24.08.2004 14:46

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
klassenattribute als array php5, klassenattribute als array in php

Alle Zeitangaben in WEZ +1. Es ist jetzt 20:17 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.