detta funakr nog, tror jag.
Class nisse
{
function getInt()
{
return 67;
}
}
$variabel = nisse::getInt();
12 svar · 472 visningar · startad av dab
jag klurar på en grej, är inte så bra på objektorientering.
Jag skulle behöva kalla en metod i en annan klass.
Det är en variabel i en template klass som jag vill byta värde i ifrån en annan klass.
Man ska visst kunna skicka referenser, pekare(??).
Nån som vet?
tacksam för svar..
/dab
detta funakr nog, tror jag.
Class nisse
{
function getInt()
{
return 67;
}
}
$variabel = nisse::getInt();
men jag vill ju ändra i en klass variabel ifrån en annan klass.
Då funkar väl inte det där, lr?
Hej,
eftersom du använder de flesta egenskaperna från en redan befintlig klass/ subklass borde det smartaste vara att ärva de egenskaper du vill ha med "extends", och sedan enbart ändra de detaljer som skiljer sig. Då har du utnyttjat OOP på ett effektivt sätt.
men det går inte, eftersom jag vill komma åt ett objekt som redan är instansierat.
Jag har en template klass som jag instansierar i index filen, sen kallar jag olika klasser som ska använda sig av det objektet.
Jag vill alltså ändra på det redan instansierade objektets variabler ifrån andra klasser.
Jag hoppas jag förklarat det bra nu =)
Nemas problemas. Skicka med din instans som en parameter ( Som reference ) till den funktion som du ska använda den från:
class Uno {
function FixaTill ( &$tpl ) {
$tpl->set ( "KEY", "VALUE", false );
}
}
$template = new Template ( "template.tpl" );
$uno = new Uno ();
$uno->FixaTill ( $template );
$template->show ();
Hemligheten ligger i &-tecknet, som visar att allt som skickas till funktionen skickas som referens bara. Kan jämföras med C++ pekare-egenskaper, man skickar bara adressen i minnet för variabeln, så att man använder samma variabel.
aha, det verkar ju funka =))))
tackar...
men jag skulle också vilja kunna använda referensen till objektet i alla metoder i min klass.
Typ skicka med som argument till konstruktorn vid instansieringen.
Är det möjligt?
Jadå, det är möjligt. Gör som du själv säger, skicka med referensen av objektet till nya klassens konstruktor:
class Uno {
var $_annatObjekt;
function Uno ( &$annatObjekt ) {
$this->_annatObjekt = $annatObjekt;
}
function FixaTill () {
$this->_annatObjekt->set ( "NYCKEL", "VÄRDE", false );
}
}
Ah, det var precis det jag letade efter =)
Men jag fick inte det att funka =(
Jag får en parse error på:
$this->tpl = $template;
Alltså i konstruktorn.
Jag får inte det att fungera, den klagar på parse error vad jag än gör, nån idé?
index.php:
$tpl = new Template ( "templates/header.ihtml" );
$login = new Login(&$tpl);
$tpl->set ( "TITLE", $g_title, false );
$login->asdf();
$tpl->show ();
Login.class.php:
class Login {
var $tpl;
function Login(&$template) {
$this->tpl = $template;
}
function asdf() {
$this->tpl->set_file ( "LOGIN", "templates/login_box2.ihtml" );
$this->tpl->set ( "FORGOTTEN_PASS", "url??", false );
}
}
Hm, det kanske inte går att lagra ett objekt i en klass? Verkar ju iofs rätt konstigt om inte det skulle gå... Jag vet att i nya( /-re? ) PHP-versioner har passing by reference tagits bort, men det gäller bara när man skickar by-reference, som jag har förstått det.
Följande ska alltså funka:
function GörNåt ( &$var ) {
$var = "SPiN loves ya'll";
}
$str = "";
GörNåt ( $str );
Men inte följande:
function GörNåt ( $var ) {
$var = "SPiN loves ya'll";
}
$str = "";
GörNåt ( &$str );
Vet faktiskt inte vad som kan vara fel... Om du provar att skapa en ny instans i klassen, och sedan ger den instansen värdet $template?
Alltså:
class Uno {
var $_tpl;
function Uno ( &$template ) {
$this->_tpl = new Template ( "nånfil.txt" );
$this->_tpl =$template;
}
}
Försöka, kan man alltid göra. :)
Det måste kommigt med något osynligt tecken när jag kopierade koden ifrån browsern, som orsakae parse error't. När jag skrev av exakt samma kod så försvann det..
Skumt.
Nu över till ett helt annat problem.
Det verkar funka ganska bra, men när jag kallar min metod:
$login = asdf(&$tpl);
eller genom konstruktorn som i sin tur kallar den:
$login = new Login(&$tpl);
Så verkar den inte ändra på orginalet av objektet utan skapa en kopia.
När jag skickar in referensen så skickar jag väl bara in adressen till minnensplatsen, lr?
Men det verkar som alla ändringar görs i:
var $tpl
och att den inte skickas tillbaks till orginalobjektet.
För när jag kallar metoden:
$tpl->show();
ifrån index.php (som skriver ut templaten) så har värdet som sattes precis glömts bort, lr så ligger den kvar i
var $tpl i objectet $login.
Jag tänkte att man kanske kunde skriva en metod som hämtar värdet typ såhär:
function getObject () {
return $tpl;
}
Men jag fick inte det att funka, kanske man kan göra något i dekonstruktorn?
Ni kan hitta all kod här:
http://194.237.47.39/schlooks/source/
Jag är jättetacksam för all hjälp hittils =)
Eftersom att du skapar en ny variabel i din nya klass, så kopieras endast det första objektet. Det går troligtvis inte att lösa på något smart sätt, utan att det blir riktigt krångligt. :l
Mitt förslag är att du istället skickar med $tpl till funktioner som tar emot by-reference, så har du allt i orginalobjektet. :)
jag ändrade lite på det och körde som Jörgen sa.
Vad det är snurrigt med OOP alltså =/
Men tack så mycket för all hjälp, nu hajar man lite mer iaf :)