PHP Forum

PHP Forum (http://www.selfphp.de/forum/index.php)
-   PHP für Fortgeschrittene und Experten (http://www.selfphp.de/forum/forumdisplay.php?f=13)
-   -   [PHP5 /OOP] Auf Eigenschaften der Vaterklasse zugreifen? (http://www.selfphp.de/forum/showthread.php?t=21936)

GrayFox 09.08.2009 13:19:39

[PHP5 /OOP] Auf Eigenschaften der Vaterklasse zugreifen?
 
Guten Tag :-)

Ich habe ein kleines(?) Problem mit der OOP in PHP. Es gibt eine listbox.php und eine test2.php.

Die listbox.php hat aktuell folgenden Inhalt:

PHP-Code:

class listbox
{
    public 
$items;
    public 
$items_collection// = array();
    
    
function __construct()
    {
        
$this->items = new list_item_f;
        
$this->items_collection = array();
    }
    
    public function 
items($index)
    {
        return 
$this->items_collection[$index];
    }
    
    function 
addItemInternal($value)
    {
        
        
$this->items_collection[] = new list_item;    
        
$index count($this->items_collection) - 1;
        echo 
$index."<br>";
        
$this->items_collection[$index]->value $value;
    }
}

class 
list_item extends listbox
{
    public 
$value;
    
    
//JS Events
    
public $events = array();
    
    
//CSS Property
    
public $css = array();
    
    function 
__construct()
    {

    }
    
    private function 
add_css($prop$value$browser 0)
    {
        
$this->ccs[$prob][$browser] = $value;
    }
    
    public function 
add_event($event$value$browser 0)
    {
        
//echo $browser;
        
$this->events[$event][$browser] = $value;
    }
    
}

class 
list_item_f extends listbox
{

    function 
__construct()
    {

    }
    
    public function 
add($value)
    {
        
parent::addItemInternal($value);
    }
    
    public function 
addEvent($key$event$value$browser "both")
    {
        
$this->key($key)->events[$event][$browser] = $value;
    }} 

Die test2.php hat aktuell folgenden Inhalt:

PHP-Code:

include('listbox.php');

$list = new listbox;
$list->items->add("1.Item");
$list->items->add("2.Item");
$list->items->add("3.Item");
echo 
"<br>";
$list->addItemInternal("Item.1");
$list->addItemInternal("Item.2");
$list->addItemInternal("Item.3");
echo 
$list->items(0)->value."<br>";
echo 
$list->items(1)->value."<br>";
echo 
$list->items(2)->value."<br>"

Wenn ich test2.php aufrufe, erscheint folgende Ausgabe:

Code:

0
1
2

0
1
2
Item.1
Item.2
Item.3

Wie man sieht wird über parent::addItemInternal($value); die Methode "addItemInternal" der Vaterklasse aufgerufen, aber erst, wenn ich $list->addItemInternal(VALUE) direkt aufrufe, wird die Eigenschaft 'items_collection' erweitert.

Hat jemand eine Idee wo mein Fehler liegt?

--------------------------------------------------
Der Sinn des Ganzen ist, dass ich in PHP einige Steuerlemente, die in der Entwicklung von Desktopanwendungen genutzt werden, nachbauen und als vorgefertigte Klassen zur Verfügung stellen möchte. DataGrid, ListView, ListBox und TreeView seien mal als Beispiel genannt.
Dies soll die Entwicklung von Rich Internet Applications unterstützen. Der Syntax soll dabei an den von .NET angelehnt sein.

Ein Beispiel sähe so aus:
PHP-Code:

$list->items->add("1.Item");

echo 
$list->items(0)->value

$list->items->remove(0);

//ect.. 


xabbuh 09.08.2009 22:06:08

AW: [PHP5 /OOP] Auf Eigenschaften der Vaterklasse zugreifen?
 
Hallo,

Zitat:

Zitat von GrayFox (Beitrag 129882)
Wie man sieht wird über parent::addItemInternal($value); die Methode "addItemInternal" der Vaterklasse aufgerufen, aber erst, wenn ich $list->addItemInternal(VALUE) direkt aufrufe, wird die Eigenschaft 'items_collection' erweitert.

woran machst du das fest?

GrayFox 09.08.2009 22:17:58

AW: [PHP5 /OOP] Auf Eigenschaften der Vaterklasse zugreifen?
 
Hallo,

zu deiner Frage - Hier dran:
PHP-Code:

include('listbox.php');

$list = new listbox;
$list->items->add("1.Item");
$list->items->add("2.Item");
$list->items->add("3.Item");
echo 
"<br>";
$list->addItemInternal("Item.1");
$list->addItemInternal("Item.2");
$list->addItemInternal("Item.3");
echo 
$list->items(0)->value."<br>";
echo 
$list->items(1)->value."<br>";
echo 
$list->items(2)->value."<br>"

das erzeugt folgende Ausgabe:
Code:

0
1
2

0
1
2
Item.1
Item.2
Item.3

items-add verweist mit parent:: auf addItemInternal. Somit müssten die ersten drei Elemente, die ausgebenen werrden 1.Item, 2.Item und 3. Item sein.

NACHTRAG:

Wenn ich folgendes ausführe:
PHP-Code:

$list->items->add("1.Item");
$list->items->add("2.Item");
$list->items->add("3.Item"); 

Dann kann ich item_collection nur, wie folgt, abfragen:
PHP-Code:

foreach($list->items->items_collection as $item)
{
        echo 
$item->value."<br>";



Aber ich ging davon aus, dass bei diesem Konstrukt:

PHP-Code:

class list_item_f extends listbox
{

        function 
__construct()
        {

        }
        
        public function 
add($value)
        {
                
parent::addItemInternal($value);
        } 

jeder Wert, der über listbox::items->add($VALUE) an listbox::addItemInternal($VALUE) weitergereicht wird und dadurch nur auf die items_collection der Vaterklasse(listbox) zugegriffen wird und somit eigentlich folgendes möglich sei:

PHP-Code:

foreach($list->items_collection as $item)
{
        echo 
$item->value."<br>";



xabbuh 10.08.2009 10:08:57

AW: [PHP5 /OOP] Auf Eigenschaften der Vaterklasse zugreifen?
 
Die hinzugefügten Objekte der ersten drei Anweisungen liegen in der Eigenschaft $items_collection des Objektes $list->items. Die der letzten drei Anweisungen dagegen in dem Objekt $list selbst.

GrayFox 10.08.2009 10:16:05

AW: [PHP5 /OOP] Auf Eigenschaften der Vaterklasse zugreifen?
 
Das habe ich gestern abend auch festgestellt. Sehr komisch. Ich habe wohl die Bedeutung von "extends" falsch verstanden. Ich habe meine Klasse(n) etwas umgeschrieben.

Dabei kam folgendes heraus.

Über folgenden Aufruf:
PHP-Code:

$this->itemsCollection[$index] = new listItem

wird dem aktuellen Arrayfeld ein neue Instanz der Klasse listItem zugewiesen.

Das klappt so weit auch. Nun die Frage - Wie kann greife ich auf eine Eigenschaft, des darüberliegenden Objektes zu?

Beispiel:

PHP-Code:

class listbox

          
public a;

          function 
__construct
          
{
                
$this->"1";
          }
.....

class 
listItem
{

          function 
test
          
{
                echo ??->
a;
          }



Grüße

xabbuh 10.08.2009 10:17:07

AW: [PHP5 /OOP] Auf Eigenschaften der Vaterklasse zugreifen?
 
Wenn du die Eigenschaft nicht in deiner Kindklasse überlagerst, geht das weiterhin über $this->a.

GrayFox 10.08.2009 10:27:52

AW: [PHP5 /OOP] Auf Eigenschaften der Vaterklasse zugreifen?
 
Zitat:

Zitat von xabbuh (Beitrag 129897)
Wenn du die Eigenschaft nicht in deiner Kindklasse überlagerst, geht das weiterhin über $this->a.

PHP-Code:

<?php
error_reporting
(E_ALL);
class 
listbox
{
        public 
$a;
        public 
$b;
        
        function 
__construct()
        {
            
$this->"1";
            
$this->= new ListItem;
            
$this->b->test();
        }
//.....
}

class 
listItem
{

        function 
test()
        {
            echo 
$this->a;
        }
}  

$list = new listbox;

?>

Das erzeugt bei der Ausführungen folgenden Fehler:

PHP-Code:

NoticeUndefined propertylistItem::$a in 

listItem stellt keine Erweiterung der Klasse 'listbox' mittels 'extends' dar.

asipak4you 10.08.2009 12:07:43

AW: [PHP5 /OOP] Auf Eigenschaften der Vaterklasse zugreifen?
 
$a ist in der Klasse listItem nicht definiert!

Du könntest $a als Parameter an die Klasse listItem übergeben.

Worauf willst du überhaupt hinaus (sorry, habs nur überflogen)?

GrayFox 10.08.2009 12:44:56

AW: [PHP5 /OOP] Auf Eigenschaften der Vaterklasse zugreifen?
 
Erstmal danke für deine Antwort :)

PHP-Code:

$a ist in der Klasse listItem nicht definiert

Ich weiß :) Ich dachte nur, dass es vielleicht einen Operator gibt für das nachfolgende Anliegen.

Zitat:

Worauf willst du überhaupt hinaus (sorry, habs nur überflogen)?
Prinzip ist folgendes - Ich habe in der Vaterklasse ein Array mit Items. Jedes Arrayfeld beinhaltet ein Objekt der Klasse 'listItem'. Jetzt würde ich gerne mit dieser Klasse auf die Eigenschaften der 'darüberliegenden' Klasse zurreifen.

PS: Ich habe mal dein Beispiel, welches wohl wieder rausgelöscht wurde, ausprobiert und erhielt dann folgenden Fehler:

PHP-Code:

Fatal errorUsing $this when not in object context in /usr/export/www/vhosts/funnetwork/hosting/aldbt/window_forms/test4.php on line 16

        
public static function getA() {
            return 
$this->a//Zeile 16
        


Ohne 'public static' erhalte ich folgende Meldung:

PHP-Code:

NoticeUndefined propertylistItem::$a in /usr/export/www/vhosts/funnetwork/hosting/aldbt/window_forms/test4.php on line 16 

Aktueller Code:

PHP-Code:

<?php
error_reporting
(E_ALL);
class 
listbox
{
        public 
$a;
        public 
$b;
        
        function 
__construct()
        {
            
$this->"1";
            
$this->= new ListItem;
            
$this->b->test();
        }

        function 
getA() {
            return 
$this->a;
        }
//.....
}

class 
listItem
{

        function 
test()
        {
            echo 
listbox::getA();
        }
}  

$list = new listbox;  

?>


DokuLeseHemmung 10.08.2009 12:54:19

AW: [PHP5 /OOP] Auf Eigenschaften der Vaterklasse zugreifen?
 
Ich habe das jetzt schon ein Weilchen verfolgt...
Zuerst nur Bahnhof verstanden!

Und jetzt weiß ich, dass du noch grundsätzliche Probleme mit dem OOP Verständnis hast.

Leitsatz 1: (verstehen und merken)
Du kannst nur Methoden oder Eigenschaften eines Objektes nutzen, wenn du diese VORHER in dieser Klasse oder einer Vater Klasse definiert hast.

Leitsatz 2:
Bei statischn Methoden Aufrufen gibts kein $this!
Woher auch, es gibt ja auch kein Objekt.


Alle Zeitangaben in WEZ +2. Es ist jetzt 09:01:59 Uhr.

Powered by vBulletin® Version 3.8.3 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.