php.de

Zurück   php.de > Webentwicklung > PHP-Fortgeschrittene

PHP-Fortgeschrittene Arbeiten mit PHP ohne Einschränkungen

Thema geschlossen
 
LinkBack Themen-Optionen Thema bewerten
Alt 08.03.2011, 18:27  
Neuer Benutzer
 
Registriert seit: 21.01.2010
Beiträge: 23
PHP-Kenntnisse:
Anfänger
Ballamann befindet sich auf einem aufstrebenden Ast
Standard magic methods kleines Verständnisproblem

Hallo

Ich habe eine Klasse geschrieben die je nach Bedarf unterschiedliche Objekteigenschaften haben soll, dazu wird in der Klasse ein Array mit erlaubten "Eigenschaften" (eigentlich ja nur deren Name) gefüllt. In einer Methode "exportProperties()" der Klasse gebe ich dann die derzeitigen Objekteigenschaften (nicht das Array mit den erlaubten Namen!) als Array zurück. Soweit so gut, nun wollte ich eine Prüfung einbauen um nur Objekteigenschaften zurückzugeben, denen ein Wert zugewiesen wurde. Allerdings bekomme ich dann immer die (eigene) Exception "NonExistingProperty"?

Hier die relevanten Codeteile:

PHP-Code:
public function __get($prop) {
        
//this->properties ist das Array mit den Eigenschaftsnamen
        
if (in_array($prop$this->properties))
            return 
$this->$prop;
        else
            throw new 
Exception('NonExistingProperty');
    }

public function 
exportProperties() {
        
        
$return = array();
        
                
//this->properties ist das Array mit den Eigenschaftsnamen
        
foreach ($this->properties as $prop)
        {
            if (!(
$this->$prob == ""))
                
$return[$prop] = $this->$prop;
        }
        
        return 
$return;
    } 
Ohne die Abfrage in exportProperties() funktioniert es, mit nicht und das verstehe ich nicht. Wieso wird da eine Exception geworfen, wenn der Zugriff eine Zeile später immer funktioniert?

Danke für eure Hilfe
Ballamann ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

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

Alt 08.03.2011, 18:37  
Moderator
 
Benutzerbild von Chriz
 
Registriert seit: 11.05.2008
Beiträge: 6.268
Chriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer Anblick
Standard

Magische Methoden solltest du - meiner Meinung nach - nur in ganz selten Fällen benutzen. Wie du siehst verliert man sehr schnell die Kontrolle darüber.

Davon unabhängig:
Warum benutzt du nicht einfach eine Objekteigenschaft protected $_properties = array()?

Mit return array_filter($this->_properties, "mb_strlen"); kannst du dann deine exportProperties() sehr einfach verkürzen, debuggen geht auch super einfach.

Edit: mit $this->_properties meine ich nicht deinen Array, aber du kannst es einfach so machen, dass du den Array mit Schlüsseln vorbelegst:
protected $_properties = array("eins" => null, "zwei" => null, ..);
Dann greift deine "ist erlaubte Property" mit array_key_exists() weiterhin.
__________________
"Nuschel ich?" - "Was?"
Chriz ist offline  
Alt 08.03.2011, 18:41  
Erfahrener Benutzer
 
Benutzerbild von Dark Guardian
 
Registriert seit: 10.10.2009
Beiträge: 2.631
PHP-Kenntnisse:
Fortgeschritten
Dark Guardian ist jedem bekanntDark Guardian ist jedem bekanntDark Guardian ist jedem bekanntDark Guardian ist jedem bekanntDark Guardian ist jedem bekanntDark Guardian ist jedem bekannt
Standard

Debuggen hilft.

var_dump($prop);
var_dump($this->properties);

Eins von beiden enthält vor der Abfrage wohl nicht das was du erwartest.
__________________
"Alles im Universum funktioniert, wenn du nur weißt wie du es anwenden musst".
Dark Guardian ist offline  
Alt 08.03.2011, 18:41  
fab
Erfahrener Benutzer
 
Benutzerbild von fab
 
Registriert seit: 28.07.2010
Beiträge: 2.308
PHP-Kenntnisse:
Fortgeschritten
fab ist ein Lichtblickfab ist ein Lichtblickfab ist ein Lichtblickfab ist ein Lichtblickfab ist ein Lichtblick
Standard

Zitat:
Zitat von Ballamann Beitrag anzeigen
PHP-Code:
public function __get($prop) {
        
//this->properties ist das Array mit den Eigenschaftsnamen
        
if (in_array($prop$this->properties))
            return 
$this->$prop
Ist dir bewusst, dass du hier in eine Endlos-Rekursion läufst, sollte $prop doch einmal im properties-Array enthalten sein? Ich nehme an, du willst hier eigentlich return $this->properties[$prop] stehen haben.
fab ist offline  
Alt 08.03.2011, 18:42  
Neuer Benutzer
 
Registriert seit: 21.01.2010
Beiträge: 23
PHP-Kenntnisse:
Anfänger
Ballamann befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von Chriz Beitrag anzeigen
Davon unabhängig:
Warum benutzt du nicht einfach eine Objekteigenschaft protected $_properties = array()?

Mit return array_filter($this->_properties, "mb_strlen"); kannst du dann deine exportProperties() sehr einfach verkürzen, debuggen geht auch super einfach.
Hallo Chriz,
Das wäre sicherlich auch eine Möglichkeit, falls es mal zwingend werden sollte werde ich das wohl so lösen. Allerdings ist bei diesem Fall jetzt (egal ob benötigt oder nicht) mein Interesse geweckt, ich würde schon ganz gerne den Grund dafür wissen

Zitat:
Zitat von fab Beitrag anzeigen
Ist dir bewusst, dass du hier in eine Endlos-Rekursion läufst, sollte $prop doch einmal im properties-Array enthalten sein? Ich nehme an, du willst hier eigentlich return $this->properties[$prop] stehen haben.
Nein das stimmt so nicht. Wie gesagt sind in dem Array $this->properties lediglich Namen gespeichert, nicht die Werte an sich. Dementsprechend greife ich mit $this->$prob aber auf einen Wert zu. Das ganze funktioniert wunderbar, ist eine Eigenschaft im "erlaubt"array wird auf sie zugegriffen.

Zitat:
Zitat von Dark Guardian Beitrag anzeigen
Debuggen hilft.

var_dump($prop);
var_dump($this->properties);

Eins von beiden enthält vor der Abfrage wohl nicht das was du erwartest.
Doch beides enthält genau was ich erwarte. Deswegen funktioniert der Zugriff ja auch eine Zeile später, nur während der if-Abfrage nicht. Kann es sein das if damit überfordert ist? Zu dynamisch für das Teil?

Geändert von Ballamann (08.03.2011 um 18:48 Uhr).
Ballamann ist offline  
Alt 08.03.2011, 18:46  
Erfahrener Benutzer
 
Benutzerbild von Dark Guardian
 
Registriert seit: 10.10.2009
Beiträge: 2.631
PHP-Kenntnisse:
Fortgeschritten
Dark Guardian ist jedem bekanntDark Guardian ist jedem bekanntDark Guardian ist jedem bekanntDark Guardian ist jedem bekanntDark Guardian ist jedem bekanntDark Guardian ist jedem bekannt
Standard

Zitat:
Zitat von fab Beitrag anzeigen
Ist dir bewusst, dass du hier in eine Endlos-Rekursion läufst, sollte $prop doch einmal im properties-Array enthalten sein? Ich nehme an, du willst hier eigentlich return $this->properties[$prop] stehen haben.
Kommt drauf an. Wenn die Eigenschaften als private tatsächlich vorliegen dann wird __get nicht erneut aufgerufen.

Zitat:
Doch beides enthält genau was ich erwarte. Deswegen funktioniert der Zugriff ja auch eine Zeile später, nur während der if-Abfrage nicht. Kann es sein das if damit überfordert ist? Zu dynamisch für das Teil?
Nein ein if wird mit einem einfach true/false nicht überfordert sein.

Ich würde mal gerne das var_dump() Ergebniss direkt vor der Abfrage sehen.
__________________
"Alles im Universum funktioniert, wenn du nur weißt wie du es anwenden musst".

Geändert von Dark Guardian (08.03.2011 um 18:51 Uhr).
Dark Guardian ist offline  
Alt 08.03.2011, 18:47  
Erfahrener Benutzer
 
Benutzerbild von mermshaus
 
Registriert seit: 14.06.2009
Beiträge: 1.731
PHP-Kenntnisse:
Fortgeschritten
mermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz sein
Standard

Schreibe doch mal ein vollständig lauffähiges Beispiel.
__________________
Blog | Buch | Kaloa
mermshaus ist offline  
Alt 08.03.2011, 18:50  
Erfahrener Benutzer
 
Registriert seit: 03.08.2010
Beiträge: 300
PHP-Kenntnisse:
Fortgeschritten
Asterixus sorgt für eine eindrucksvolle AtmosphäreAsterixus sorgt für eine eindrucksvolle Atmosphäre
Asterixus eine Nachricht über Skype™ schicken
Standard

PHP-Code:
<?php
define
('CRLF'"\r\n");
error_reporting(-1);
class 
Test {
    private 
$a 'aa';
    private 
$b 'bb';
    private 
$c 'cc';
    private 
$d;
    private 
$e '';
    private 
$f 'ff';
    private 
$properties = array('a''d''e''f');
    public function 
__get($prop) {
        if (
in_array($prop$this->properties)) {
            return 
$this->$prop;
        } else {
            throw new 
Exception('Property '.$prop.' doesn\'t exist.');
        }
    }
    public function 
exportProperties() {
        
$return = array();
        foreach (
$this->properties as $property) {
            if (!(
$this->$property == "")) {
                
$return[$property] = $this->$property;
            }
        }
        return 
$return;
    }
}

$Test = new Test;

try {
    echo 
print_r($Test->exportProperties(), true).CRLF;
    
var_dump($Test->a).CRLF;
    
var_dump$Test->d).CRLF;
    
var_dump$Test->e).CRLF;
    
var_dump$Test->f).CRLF;
    
var_dump$Test->b).CRLF;
    
var_dump$Test->c).CRLF;
} catch (
Exception $e) {
    echo 
$e->getMessage().CRLF;
}
Code:
Array
(
    [a] => aa
    [f] => ff
)

string(2) "aa"
NULL
string(0) ""
string(2) "ff"
Property b doesn't exist.
Für mich ist da nichts falsch.
Asterixus ist offline  
Alt 08.03.2011, 18:50  
Neuer Benutzer
 
Registriert seit: 21.01.2010
Beiträge: 23
PHP-Kenntnisse:
Anfänger
Ballamann befindet sich auf einem aufstrebenden Ast
Standard

vielleicht wird es klarer wenn ich die __set poste:

PHP-Code:
public function __set($prop$value) {
        
//schauen ob die Eigenschaft im "erlaubte Eigenschaften"array ist
        
if (in_array($prop$this->properties))
            
$this->$prop $value;
        else
            throw new 
Exception('NonExistingProperty');
    } 
@Asterixus: In meiner Klasse existieren aber keine privaten Variablen, das ist ja der Sinn dabei. Die Klasse "wählt" aus vielen hundert Eigenschaften ein paar aus (bspw aus einer Textdatei) und nur auf diese Eigenschaften kann dann zugegriffen werden.

Geändert von Ballamann (08.03.2011 um 18:55 Uhr).
Ballamann ist offline  
Alt 08.03.2011, 18:55  
Erfahrener Benutzer
 
Benutzerbild von Dark Guardian
 
Registriert seit: 10.10.2009
Beiträge: 2.631
PHP-Kenntnisse:
Fortgeschritten
Dark Guardian ist jedem bekanntDark Guardian ist jedem bekanntDark Guardian ist jedem bekanntDark Guardian ist jedem bekanntDark Guardian ist jedem bekanntDark Guardian ist jedem bekannt
Standard

b ist ja auch nicht in $this->properties enthalten...

Das Skript tut doch genau das was es soll.

Es exportiert nur erlaubte Eigenschaften mit einem Wert.

Bei einer nicht erlaubten Eigenschaft (b) kommt die Exception.
__________________
"Alles im Universum funktioniert, wenn du nur weißt wie du es anwenden musst".
Dark Guardian ist offline  
Thema geschlossen


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
suche kleines Projekt für externe Ausbildung zum Nulltarif Jonny2010 Freizeit 7 20.07.2011 10:13
kleines Script? Gunnar2100 Scriptbörse 2 20.10.2009 14:52
Partition Magic - Mist? cybertrek Off-Topic Diskussionen 8 09.02.2007 11:14
Suche für mySQL alternatives Backend, kleines CMS ? PHP Tipps 2005 10 24.01.2005 12:11

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
php magic methods, magic methods php, php magic methods functions, magic functions php, php magic functions, magic function php, php magic methode, php magic methods unterstützung, magic functions, hph magic methods, php magic methods __get wozu, probleme magic functions php, php magic property, php magic methods private properties

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