AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein [PHP5] Objekten Eigenschaften mit Get-/Set-Methoden geben
Thema durchsuchen
Ansicht
Themen-Optionen

[PHP5] Objekten Eigenschaften mit Get-/Set-Methoden geben

Offene Frage von "Panthrax"
Ein Thema von Panthrax · begonnen am 17. Jul 2005
Antwort Antwort
Panthrax

Registriert seit: 18. Feb 2005
286 Beiträge
 
Delphi 2010 Enterprise
 
#1

[PHP5] Objekten Eigenschaften mit Get-/Set-Methoden geben

  Alt 17. Jul 2005, 18:35
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.
  Mit Zitat antworten Zitat
Antwort Antwort


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 aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:06 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