Variable zur Laufzeit in Klasse erstellen

cesupa

Erfahrenes Mitglied
Hallo,

vor kurzem kam mir mal die spontane Idee eine "dynamische" Klasse in PHP zu schreiben, heißt also während der Laufzeit des Scripts soll zur Klasse eine Variable mit beliebigen Namen hinzugefügt werden, auf die dann auch regulär zugegriffen werden kann.

Mein erster Versuch:

PHP:
class spage{

function new_obj($objname)
{
  global $$objname;
  $this->$$objname="TEST";
}

function use_obj($objname2)
{
  global $$objname2;
  echo "AUSGABE: ".$this->$$objname2;
}
}

Aufruf:

PHP:
include_once("data/php/html/spage.php");

$s=new spage();

$s->new_obj("html");
$s->use_obj("html");

So weit funktioniert alles wie es soll, jedoch funktioniert folgendes nicht:

PHP:
include_once("data/php/html/spage.php");

$s=new spage();

$s->new_obj("html","shtml");
echo $s->html;                          //Funktioniert nicht, warum?

Ich wollte jetzt nur mal wissen warum das nicht funktioniert und ob es eine Möglichkeit gibt, das funktionsfähig zu machen.

Gruß
cesupa
 
Hallo!
Ist im Prinzip eine ganz nette Sache, dir du dir da ausgedacht hast. Habe mir das eben mal angeschaut.
PHP:
echo $s->html;
Das kann nicht funktionieren, weil du in deiner Klasse keine Methode hast die nur "html" heißt.
Du müsstest deine Klasse ein bissi umbauen. Hab da mal einen Vorschlag:
PHP:
class spage{

function new_obj($objname, $wert)
{
  global $$objname;
  $this->$$objname=$wert;
}

function use_obj($objname2)
{
  echo "AUSGABE: ".$this->$$objname;
}
}  

$s=new spage();

$s->new_obj("html","shtml");
echo $s->use_obj("html");

Schau es dir mal an, wenn du noch fragen hast. Nur zu...
 
Die Klasse wäre schöner, wenn du z. B. mit [phpf]func_get_arg[/phpf] arbeiten würdest, da man dann unbegrenzt viele Variablen mit angeben könnte.
(Persönliche Meinung)
 
Heißt das, ich kann die erstellte Variable nur in den Funktionen meiner Klasse nutzen und nicht außerhalb. Ich finde das ein wenig umständlich, wenn ich da ständig eine Funktion benutzen muss, nur weil ich der Variable z.B. einen neuen Wert zuweisen möchte.
Heißt also sowas einfaches wie:

PHP:
$s->ErstellteVariable=WERT;

funktioniert überhaupt nicht, richtig. Das war es nämlich worum es mir ging.
Dann hätte ich noch eine andere Frage: gibt es eine Möglichkeit bei PHP eine Funktion quasi als Variable zu verwenden? Also ungefähr sowas hier:

PHP:
$s->funktion("ErstellteVariable")=WERT;

Gruß
cesupa
 
Du hattest bislang noch nicht so viel mit OOP zu tuen, kann das sein?
PHP:
$s->ErstellteVariable=WERT;
Geht nicht, weil auf Klassenvariablen immer über eine Funktion zugegriffen werden muss. Das ist der Prinzip der OOP. Siehe folgendes:
PHP:
$s->setVariable($wert);
Diese Methode muss dann natürlich in der Klasse auch vorhanden sein.
PHP:
function setVariable($parWert){
this->Klassenvariable = $parWert;
}

Deine zweite Frage verstehe ich leider nicht so ganz.
gibt es eine Möglichkeit bei PHP eine Funktion quasi als Variable zu verwenden?
Du kannst hergehn und folgendes machen:
PHP:
function foo($parA, $parB){
return $parA+$parB;
}

$var = foo($a, $b);

Wenn du Einsteiger in OOP bist empfiehlt sich folgendes Videotutorial:
http://www.tutorials.de/forum/php-v...ktorientierte-programmierung-oop-11-27-a.html
 
Man kann auch so einer Klasse eine Variable hinzufügen.

PHP:
class a
{
  public __construct()
  {
  }
}

$class = new a();
$class->foo = 'bar';
echo $class->foo;
Ich glaube das geht aber nur mit PHP5.


Gruß Radhad
 
Bisher hab ich unter PHP nur wenig mit Klassen gemacht. Ich dachte eigentlich das wäre auch so wie bei C/C++ das man da eine Klassenvariable public machen kann und so auch über eine Instanz der Klasse verwenden kann. Aber naja, man kann ja nicht alles im Leben haben;)
Ich werd mir dann mal das Video-Tutorial reinziehen. Dankeschön für deine Hilfe.

Gruß
cesupa
 
Grundsätzlich finde ich es unsauber, dass man direkt auf Klassenvariablen zugreifen kann.
Schöner ist einfach eine Methode, die einem den benötigten Inhalt zurückgibt.

Zum Beispiel sowas hier (PHP5, sollte sich aber problemlos nach PHP4 integrieren lassen)

PHP:
<?php
class Foo 
{
  public function setVar() # Vars werden im Format Varname - Varinhalt übergeben
  {
    $args = func_get_args();
    for($i = 0; $i < func_num_args(); $i++) {
      $this->{$args[$i]} = $args[$i+1];
      $i++;
    }
  }
  public function getVar($identifier)
  {
    return $this->{$identifier};
  }
}

$test = new Foo;

$test->setVar("foo", "bar", "bar", "foo");

echo $test->getVar("foo");
?>

Ist so ähnlich wie Sneaky es schonmal geschrieben hat.
 
Zurück