Archiv verlassen und diese Seite im Standarddesign anzeigen : Zugriff auf Objekt
Opendix
26.10.2005, 21:24:20
Also hier erstmmal mein Code:
<?php
include('Smarty/Smarty.class.php');
$smarty = new smarty;
$opendix = new opendix;
class functions
{
public function output_var($var, $durch)
{
$smarty -> assign($var, $durch);
}
}
class opendix
{
functions::output_var('test','test');
}
?>
nun das bicht mit einem fehler ab:
...Call to a member function assign() on a non-object...
das scheint so nicht zu gehen, und zwar kennt er das objekt $smarty in der klasse functions nicht, wie krieg ich das nun da rein?
dirter
26.10.2005, 22:34:01
ich weiß es nicht genau, aber schreib mal in deine funktion global $smarty;
meikel (†)
26.10.2005, 23:22:30
Also hier erstmmal mein Code:
das scheint so nicht zu gehen, und zwar kennt er das objekt $smarty in der klasse functions nicht,
Korrekt erkannt, daß der Geltungsbereich von PHP-Variablen (http://www.php.net/manual/de/language.variables.scope.php) auch für Deine Scripte zutrifft.
wie krieg ich das nun da rein?
Indem man dem Constructor die Referenz auf die Instanz übergibt.
$smarty = new smarty;
$opendix = new opendix(&$smarty);
class opendix
{
$smarty = false;
function __construct($smarty = false)
{
if ($smarty !== false)
$this->smarty = $smarty;
}
function tu_was($var)
{
return $this->smarty->mach_was($var);
}
}
$opendix->tu_was('abc');
Sowas:
class opendix
{
functions::output_var('test','test');
}ist Unfug und müßte einen Syntaxfehler anzeigen.
Außerdem ist functions offenbar keine objektorientierte Klasse sondern nur eine Funktionssammlung.
Opendix
26.10.2005, 23:53:52
erstmal danke für die antworten... und korrekt erkannt, class funtions ist nur eine funktionssammlung :)
das global in der funktion war die Lösung...
und @meikel, du hast vollkommen recht, dass functions::output_var('test','test'); an dieser Position sinnlos erscheint, da hab ich ja die funktion drumrum vergessen (bzw. den konstuktor...)
auf jedenfall danke euch beiden ;)
feuervogel
27.10.2005, 00:29:24
das global in der funktion war die Lösung...
global zu benutzen ist dreckig und immer zu vermeiden, unter keinen umständen aber als lösung zu bezeichnen.
|Coding
27.10.2005, 01:07:03
Aber vielleicht eine provisorische Lösung.
Wie aber würdest Du es machen?
feuervogel
27.10.2005, 10:34:54
Aber vielleicht eine provisorische Lösung.
ein provisorium ist keine lösung.
Wie aber würdest Du es machen?
ich würde nicht nur, sondern ich mache es so wie meikel. ich übergebe im konstruktor die instanzen der klassen, die außerhalb der klasse bestehen und die ich innerhalb einer klasse benutzen möchte.
dies ist in meinem fall nur nicht smarty, da sich meine klassen (bisher) nicht um ein- und ausgabe gekümmert haben.
Opendix
27.10.2005, 12:45:43
aber die klasse functions ist nur eine funktionssammlung und wird nie instanziert, somit hats da auch kein konstruktor, dann müsste ich ja jeder funktion die referenz auf das andere Objekt mitgeben!
oder die funktionen alle aus der klasse raus nehmen...
|Coding
27.10.2005, 13:11:21
ein provisorium ist keine lösung.
Das ist Ansichtssache.
meikel (†)
27.10.2005, 13:45:40
aber die klasse functions ist nur eine funktionssammlung und wird nie instanziert,
Und genau das ist ja falsch.
Du verwendest 3 Klassen, die sich allesamt untereinander nicht kennen. Wie soll das funktionieren? Jede Klasse benutzt ihren eigenen Namensraum.
Opendix
27.10.2005, 17:17:37
Ja das ist mir schon so weit klar, mache das nun auch so, dass ich an die klasse Opendix eine Referenz von dem Objekt smarty übergebe… aber wie mache ich das mit der Klasse functions, von der habe ich Instanz, wie kriege ich nun das Objekt von smarty da rein ohne global zu benutzen und ohne eine Instanz der Klasse functions machen zu müssen?
meikel (†)
27.10.2005, 17:20:34
aber wie mache ich das mit der Klasse functions, ...Wie sowas prinzipiell gemacht wird, hatte ich ja schon geschrieben. Warum fragst Du trotzdem noch mal?
feuervogel
27.10.2005, 20:49:20
Das ist Ansichtssache.
und was wäre deine lösung für das problem?
|Coding
27.10.2005, 20:54:37
Meine Lösung wäre seiner sicher recht ähnlich, weil ich es mit Klassen noch nicht so habe. Darum habe ich ja auch nach einer besseren Lösung als seiner gefragt, weil ich erstens selber wissen wollte wie man es besser machen kann und zum anderen war das eine offene Frage die es zu klären galt :-)
feuervogel
27.10.2005, 21:08:09
Meine Lösung wäre seiner sicher recht ähnlich, weil ich es mit Klassen noch nicht so habe. Darum habe ich ja auch nach einer besseren Lösung als seiner gefragt, weil ich erstens selber wissen wollte wie man es besser machen kann und zum anderen war das eine offene Frage die es zu klären galt :-)
naja, für mich sind klassen (wie funktionen) nach außen hin geschlossen, das heißt sie benötigen nichts, was nicht über die schnittstellen (die methoden) in die klassen hineingelangt. das einzige, was meinen klassen brauchen, ist meist ein datenbank-server im hintergrund.
ich fänds halt uncool, dass ich eine klasse nicht benutzen könnte, nur weil eine variable außerhalb der klasse nicht grade so heißt bzw. den inhalt hat wie es der autor der klasse vorgesehen hat, denn vielleicht habe ich ja eine ganz andere namenskonvention als der autor der klasse.
vBulletin® v3.8.3, Copyright ©2000-2024, Jelsoft Enterprises Ltd.