Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   [PHP5] Objekten Eigenschaften mit Get-/Set-Methoden geben (https://www.delphipraxis.net/49884-%5Bphp5%5D-objekten-eigenschaften-mit-get-set-methoden-geben.html)

Panthrax 17. Jul 2005 17:35


[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:
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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:37 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz