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:
Notice: Undefined property: TList::$Items in H:\WWW\Hilfsskripte\Classes.php on line 22
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.
Hier ist der Quelltext meiner .php-Datei. Die Zeile an der PHP meckert und die Zeile an der PHP nicht meckert sind markiert.
Code:
<?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);
?>
Die Ausgabe ist (Quelltext der ausgegebenen
HTML-Seite):
Code:
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"
}
}
}
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.
Panthrax.