![]() |
[PHP5] Objekten Eigenschaften mit Get-/Set-Methoden geben
Hallo.
Mit Version 5 von PHP ist PHP auch für mich wieder interessant geworden. (Objekte in PHP 4 waren ja unzumutbar.) Nun denn: Eigenschaften à la Delphi kennt PHP trotzdem nicht. Ich hatte aber gehofft, mir mit Hilfe der PHP-Methoden __get(...) und __set(...) für Objekte dieses Verhalten nachahmen zu können. Leider beschwert sich PHP, wenn ich an der einen Stelle auf eine Eigenschaft der Klasse ($this->Items) zugreifen möchte:
Code:
An anderer Stelle kann ich auf die Eigenschaft dieser Klasse ($Instance->Items, Instance ist Variable dieser Klasse) problemlos zugreifen, und es passiert auch das richtige.
Notice: Undefined property: TList::$Items in H:\WWW\Hilfsskripte\Classes.php on line 22
Hier ist der Quelltext meiner .php-Datei. Die Zeile an der PHP meckert und die Zeile an der PHP nicht meckert sind markiert.
Code:
Die Ausgabe ist (Quelltext der ausgegebenen HTML-Seite):
<?php
class TList extends TObject { function __construct() { $this->FFields+= array( //'FCount' => 0, 'FItems' => array('#') ); $this->FProperties+= array( 'Count' => array('GetCount',''), 'Items' => array('DefaultGet','DefaultSet') ); $this->Name = 'List'; $this->Items = array('+'); // ### hier meckert PHP nicht } // Ein-/Auskommentieren folgender 2 Zeilen ändert auch nichts //function __get($Name) { return(parent::__get($Name)); } //function __set($Name, $Value) { parent::__set($Name,$Value); } function GetCount() { return(count($this->Items)); } // ### hier meckert PHP! (Zeile 22) //function GetCount() { return($this->FCount); } // hier würde PHP übrigens auch meckern } class TObject { protected function DefaultGet($PropertyName) { return($this->FFields['F'.$PropertyName]); } protected function DefaultSet($PropertyName, $Value) { $this->FFields['F'.$PropertyName] = $Value; } protected $FFields = array( 'FName' => 'Object' ); protected $FProperties = array( // Name => array(Get-Methode, Set-Methode) 'Name' => array('DefaultGet','DefaultSet') ); /* __get($PropertyName) Die Funktion ermittelt zu einer Eigenschaft mit dem Namen PropertyName den zugehörigen Wert. */ function __get($Name) { if(isset($this->FProperties[$Name])) { $GetMethod = $this->FProperties[$Name][0]; switch($GetMethod) { case 'DefaultGet': return($this->DefaultGet($Name)); default: return($this->$GetMethod()); } } else //if(isset($this->FFields[$Name])) { return($this->FFields[$Name]); } } /* __set() Die Funktion setzt zu einer Eigeschaft mit dem Namen PropertyName den zugehörigen Wert. */ function __set($Name, $Value) { if(isset($this->FProperties[$Name])) { $SetMethod = $this->FProperties[$Name][1]; switch($SetMethod) { case 'DefaultSet': return($this->DefaultSet($Name,$Value)); default: return($this->$SetMethod($Value)); } } else //if(isset($this->FFields[$Name])) { $this->FFields[$Name] = $Value; } } } /* Testabteilung */ $Instance = new TList; //$Instance->Names = 'Instance'; print($Instance->Name); print($Instance->Count); print_r($Instance->Items); // ### hier meckert PHP auch nicht var_dump($Instance); ?>
Code:
Was also mache ich falsch? Warum "kennt" PHP an der einen Stelle die Eigenschaft? (Mit Hilfe der __get(...) und __set(...)-Methoden ermittelt/gesetzt.) Und warum übergibt PHP an anderer Stelle die Nachfrage nach dieser Eigenschaft nicht an diese Methoden, sondern meckert rum, das sie undefiniert seien.
List
[b]Notice[/b]: Undefined property: TList::$Items in [b]H:\WWW\Hilfsskripte\Classes.php[/b] on line [b]22[/b] 0Array ( [0] => + ) object(TList)#1 (2) { ["FFields:protected"]=> array(2) { ["FName"]=> string(4) "List" ["FItems"]=> array(1) { [0]=> string(1) "+" } } ["FProperties:protected"]=> array(3) { ["Name"]=> array(2) { [0]=> string(10) "DefaultGet" [1]=> string(10) "DefaultSet" } ["Count"]=> array(2) { [0]=> string(8) "GetCount" [1]=> string(0) "" } ["Items"]=> array(2) { [0]=> string(10) "DefaultGet" [1]=> string(10) "DefaultSet" } } } Panthrax. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:49 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz