• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

[Erledigt] Konstante Member Variable

Status
Für weitere Antworten geschlossen.

Prophet

Super-Moderator
Moderator
Ich habe vor in einer Klasse eine Variable anzulegen inwelcher ein Objekt gespeichert wird. Man sollte dieses Objekt natürlich möglichst leicht bearbeiten können jedoch anderer seit nicht auf die variable selbst zugreifen...

Das bringt mich in eine zwickmühle:
Code:
$objekt->klasse_aufrufen()->klassen_funktion();
Diese methode sichert mir das ich die variable sebst nicht verändern kann jedoch habe ich das problem das ich nicht mehr auf die variable zugreife wenn ich dsie mit return zurückgebe sondern auf eine kopie.

gehen wir davon aus ich gebe eine referenz aus so habe ich eine art "zeiger" auf die inner variable jedoch kann man sich damit zugang zu var verschaffen...

Die andere möglichkeit wäre ein direkt zugriff aber in dem fall wäre sie ganz ungeschützt...

weiß jemand wie ich das machen kann? außer das ich für jede meber funktion der variblen eine funktion in diesem objekt erstelle?

mfg Prophet
 
Werbung:
also mit referenzen kannst die variable selbst nicht veraendern!

hier ein beispiel
[php:1:04ef039a41]
<?php

class arbeiter {
private $slogan;
public function __construct($slogan) {
$this->slogan=$slogan;
}

public function sprich() {echo $this->slogan."
";}
}

class chef {
protected $arbeiter;

public function __construct() {
$this->arbeiter = new arbeiter("Yes Sir!");
}

function &getArbeiter() {return $this->arbeiter;}
}

$myChef = new chef();

$obj = $myChef->getArbeiter();
$obj->sprich();
$obj = new arbeiter("Noch fuenf minuten");
$obj->sprich();
$myChef->getArbeiter()->sprich();
?>
[/php:1:04ef039a41]
 
Aber wenn ich nun folgendes mache:

[php:1:6e3a70e34d]<?php
/*Klassen*/


$myChef = new chef();

$obj = $myChef->getArbeiter();
$obj->sprich();
$obj = new arbeiter("Noch fuenf minuten");
$obj->sprich();
$arbeiter = $myChef->getArbeiter();
$arbeiter = NULL; /*lösche ich damit nicht die variable in der klasse da diese ja referenziert wird?*/
?>[/php:1:6e3a70e34d]

EDIT: Ich habe es jetzt getestet ich verstehe aber nicht warum das nicht geht... Ich glaube ich habe referenzen missverstanden was genau ist eine referenz? :oops:
 
Werbung:
$arbeiter ist jetzt ein Zeiger auf einen Arbeiter. D.h. Du hast zwei Zeiger auf ein Objekt. Wenn Du dann $arbeiter NULL zuweist, wird der Zeiger umgebogen und zeigt nicht mehr auf das Arbeiter Objekt. Am anderen Zeiger ändert sich aber nix.

Da Du in PHP nicht wie in C++ explizit den Destruktor eines Objektes aufrufen kannst, hast Du keine Chance, der Chef Klasse den Arbeiter kaputt zu machen.
 
das heißt diese methode funktioniert...

[php:1:f1d934f827]<?php
class chef {
protected $arbeiter;

public function __construct() {
$this->arbeiter = new arbeiter("Yes Sir!");
$ref = &$this->arbeiter;
}

function &getArbeiter() {return $this->arbeiter;}
}
?>[/php:1:f1d934f827]
verständnisfrage:

$ref = &$this->arbeiter; <-- was ist sinn dieser anweisung?

function &getArbeiter() {return $this->arbeiter;} <-- warum machst du es so? geht es nicht auch so:
function getArbeiter() {return &$this->arbeiter;}

EDIT: Ich habe ein wenig herumgetüfelt und bin auf eine lücke gestossen...
[php:1:f1d934f827]<?php
class arbeiter {
private $slogan;
public function __construct($slogan) {
$this->slogan=$slogan;
}

public function sprich() {echo $this->slogan."
";}
public function spruch($slogan) { $this->slogan = $slogan;} /*NEU*/
}

class chef {
protected $arbeiter;

public function __construct() {
$this->arbeiter = new arbeiter("Yes Sir!");
$ref = &$this->arbeiter;
}

function &getArbeiter() {return $this->arbeiter;}
}

$myChef = new chef();

$obj = $myChef->getArbeiter();
$obj->sprich();
$obj = new arbeiter("Noch fuenf minuten");
$obj->sprich();
$myChef->getArbeiter()->sprich();

$arbeiter = $myChef->getArbeiter(); /*NEU*/
$arbeiter->spruch('neuer spruch'); /*NEU*/

$myChef->getArbeiter()->sprich(); /*NEU*/
$arbeiter->sprich(); /*NEU*/
?>[/php:1:f1d934f827]

ausgabe:
Yes Sir!
Noch fuenf minuten
Yes Sir!
neuer spruch
neuer spruch

ich glaube ich habe dein beispiel kaputt gemahct...
 
verständnisfrage:

$ref = &$this->arbeiter; <-- was ist sinn dieser anweisung?

sorry, das $ref = &$this->arbeiter habe ich vergessen zu entfernen wurde gerade geedit. es hat keine bedeutung.

function &getArbeiter() {return $this->arbeiter;} <-- warum machst du es so? geht es nicht auch so:
function getArbeiter() {return &$this->arbeiter;}

nein so geht es nicht. die zweite version ist nicht erlaubt.

EDIT: Ich habe ein wenig herumgetüfelt und bin auf eine lücke gestossen...
ne, das ist keine luecke. du hast ja eine funktion geschrieben die den geschuetzten slogen ueberschreiben soll, also koenntest du auch spruch in setSloagen umbenenen. das ist voellig legitim
bei deiner frage ging es darum das ein user nicht die moeglichkeit hat den arbeiter in myChef zu loeschen und das ist auch in meinem bsp nicht moeglich
 
Werbung:
Du ast recht löschen kann man die variable ja nicht und ob man eine funktion nun so aufruft oder anderes ist ja egal. danke!
 
PS: Was ist eine Referenz...

hier ein anschauliches beispiel.
[php:1:fdcd91f96b]
<?php
// ich, feyyaz, besitze ein haus (entspricht meinChef hat einen arbeiter)
// so jetzt fragst du, prophet, mich nach meinem haus
$prophet = $feyyaz->getHaus(); // (entspricht objmyChef->getArbeiter())
// du weist jetzt alles ueber mein haus
// jetzt kommt der feind und loescht dein gehirn
$prophet = NULL;
// du weisst nicht mehr wo mein haus ist, da aber ich nichts mit dem feind zu tun hatte, kann ich dir wieder sagen wo mein haus steht
$prophet = $feyyaz->getHaus();
// jetzt weisst du wieder wo mein haus ist.
?>
[/php:1:fdcd91f96b]

EDIT: wuerdest du jetzt aber z.B. dein spruch beispiel nehmen, wo du ja den spruch aendern kannst.

das ist wie
[php:1:fdcd91f96b]
$prophet = $feyyaz->getHaus();
$prophet->aenderWandfarbe("rot");
[/php:1:fdcd91f96b]
im referenz fall aenderst du meine haus farbe, weil du ja weisst wo mein haus ist.

wuerden wir jetzt aber ohne den & (referenz operator) arbeiten
dann musst du dir vorstellen, das ich dir nur erzaehle wie mein haus aussieht, aber du nie erfaehrst wo es steht und somit, wenn du $prophet->aenderWandfarbe aufrufst, nur das Haus aus meiner beschreibung in Deiner phantasie ummalst. Da ich aber nicht weis was du in deiner phantasie tust, werde ich bei deiner erneuten frage nach meinem Haus ($prophet = $feyyaz->getHaus()) das gleiche antworten wie zuvor, also bekommst du die gleichen informationen wie bevor du die wandfarbe geaendert hast

confus, ich weis, aber irrgendwie auch bildlich, oder?
 
Werbung:
Status
Für weitere Antworten geschlossen.
Zurück
Oben