Gå til innhold

variabel utenfor funksjon + funksjon = sant?


Gjest Slettet+142

Anbefalte innlegg

Gjest Slettet+142

hallo :)

 

jeg har et problem. eller... ja. et problem.

det er enormt irriterende å måtte huske på å legge inn "global $mysql;" i første linje i hver funksjon for at mysql-en skal virke..

 

er det noe måte å få en variabel til å gjelde i alle funksjoner og lignende?

 

ja, jeg har jsett på php.net, men jeg er visst nok kjent for å se for dårlig over :confused:

 

Takk ofr hjelp

Lenke til kommentar
Videoannonse
Annonse

vel, hvis det er en enkel streng, tall eller bool variabel kunne du bruke konstanter, ellers har du også $GLOBALS["mysql"], men du har sikkert hørt før at globals ikke er lurt å bruke i denne konteksten. en annen mulighet hadde vært å gjort om alle funksjonene dine til en eller flere klasser.

Lenke til kommentar
Gjest Slettet+142

jeg bruker klasser.. og hvis jeg bruker

define("link", mysqli_connect("xxx", "xxx", "xxx", "mydbxxx"), false);

får jeg warning.. :(

 

men hva er fordelen med å bruke klasser da? siden jeg allerede bruker klasser, virker det jo som om dette kanskje er noe bra? :p

Lenke til kommentar

Når du bruker klasse kan du definere variabler for HELE klassen... Et eksempel:

 

PHP

<?php

 

class test {

 

var hei;

 

function hallo(){

 

 $this->hei "yo";

echo $this->hei;

 

}

 

function yo(){

echo $this->hei;

}

 

}

 

 

$test = new test;

$test->hallo();

$test->hei();

 

?>

Lenke til kommentar
Gjest Slettet+142

ahh. jeg har ikke alle i en. men kan prøve noe lignende :)

 

"rapporter" tilbake senere :)

 

edit: faktisk så hadde jeg det på noe lignende måte.

men i funksjonen måtte jeg da ha f.eks:

 

<?php

$mysql = new mysql();

function hei(){
global $mysql;
$message = mysqli_fetch_assoc(mysqli_query($mysql->link, "SELECT 'jeghardetgøy' as 'message'"));
echo $message["message"];
}

?>

 

 

edit:

 

kan jeg lage en klasse som "extender" alle de andre klassene mine, men at de andre klassene fremdeles kan brukes seperat?

Endret av Slettet+142
Lenke til kommentar

inheritance kalles det, og er noe alle objekt-orienterte språk har. Såvidt jeg husker gjør PHP dette med keywordet "extends":

<?php
class Klasse1
{
   protected $var1 = "Klasse 1";
}
class Klasse2 extends Klasse1
{
   public $var2 = "Klasse 2";
}
$k1 = new Klasse1(); // kan brukes som vanlig
$k2 = new Klasse2(); // en utvidet versjon av Klasse1

echo $k2->var1;
?>

Endret av hockey500
Lenke til kommentar
Gjest Slettet+142

kan jeg da ha

<?php
class Klasse1
{
  protected $var1 = "Klasse 1";
}
class Klasse2
{
  protected $var2 = "Klasse 2";
}
class Klasse3
{
  protected $var3 = "Klasse 3";
}
class Klasse4
{
  protected $var4 = "Klasse 4";
}
class Totalet extends Klasse1 extends Klass2 extends Klasse3 extends Klasse4 // eller må det gjøres med drittent? :P
{
  public $total = "Klasse 2";
}
$k1 = new Klasse1(); // kan brukes som vanlig
$k2 = new Klasse2(); // kan brukes som vanlig
$k3 = new Klasse3(); // kan brukes som vanlig
$k4 = new Klasse4(); // kan brukes som vanlig
$total = new totalet(); // en utvidet versjon av Klasse1

echo $k2->var2;
echo $k2->var1; // virker ikke sant?
echo '<br>';
echo $total->var2;
?>

og det vil virke akkurat som ditt eksempel hockey500? :)

Lenke til kommentar

Nei, PHP støtter ikke multiple inheritance, så du kan kun extende en fra klasse. Og angående $k2->var1, det vil ikke funke siden Klasse2 ikke extender Klasse1.

 

Jeg vet ikke hvordan støtten for multiple inheritance av interfaces er i PHP, men dette blir vel ofte regnet som en "workaround" for mangel på multiple inheritance av klasser. Personlig har jeg aldri sett nytten i interfaces, så hvis du har et godt svar på det kan du gjerne opplyse meg litt :whistle:

Endret av hockey500
Lenke til kommentar

:p Hvis du ikke har programmert i andre språk i php er ikke det så rart. PHP har for det første hatt dårlig støtte for oop (objekt-orientert programmering) inntil versjon 5, hvor dette har bedret seg. Interfaces er også et begrep du så godt som aldri vil snuble over i PHP-sammenheng, rett og slett fordi du ikke trenger det (bare min mening).

 

Multiple inheritance: det du prøvde å forklare meg koden din, nemlig at en klasse samler funksjonaliteten til flere klasser ved å skrive

class k1 {}
class k2 {}
class k3 {}
class K extends k1, k2, k3 {}

dette er ikke tillatt i PHP, men dette er tillatt:

class k1 {}
class K extends k1 {}

Noen språk, som C++, har støtte har støtte for det jeg prøvde å gjøre i første eksempel. inheritance betyr "arv" på norsk, og det er nettopp det du gjør. du "arver" funksjonalitet fra en "parent class" (foreldreklasse). single inheritance, altså å arve fra en parent class, er derimot tillatt i PHP.

 

Interface: sammenliknes ofte med en "kontrakt" som klasser må oppfylle for å være gyldige. Si at en klasse implementerer et interface (minKlasse extends mittInterface), da "lover" klassen din å implementere all funksjonalitet satt i interfacet.

C#-kode, fordi det er det jeg er vant til. satser på at du skjønner poenget

interface ImittInterface { // vanlig å starte interface-navn med en stor I
   string variabel1;
   int integer1;
}
class minKlasse : ImittInterface { // C# bruker : istedenfor "extends"
   public string variabel1;
}

 

Her har jeg et interface med 2 variabler, som da klassen må inneholde for å kunne brukes. klassen inneholder kun den ene variabelen, derfor vil det IKE gi an på lage et objekt av klassen. skriver du (i C#):

minKlasse mittObjekt = new minKlasse();

så vil du få en feil. hvis du derimot legger til den andre variabelen i tillegg i klassen, vil det gå fint.

Lenke til kommentar
Gjest Slettet+142

hmm...har holdt på å lese en bok om C++ i noen uker nå, men har ikke komt over OOP enda.. :p

men jeg fikk ihvertfall svaret mitt; det går ikke an å ha en _variabel_ løselig i alle funksjoner uten bruk av globals :(

 

takk for hjelp og kodevisning :)

Lenke til kommentar

Hvis den variabelen ligger i en klasse, og alle funksjonene dine er metoder i klassen, er det jo ikke noe problem.

 

<?php
class Klasse
{
  public $var = "Hei";

  function funksjon1()
  {
      echo $this->var; // funker fint
  }
  function funksjon2()
  {
      echo $this->var; // funker fint
  }
}
?>

Hvis du skal ha tilgang til den fra en annen klasse:
class Klasse2 {
  var $var = $Klasse::var;

  function funksjon1()
  {
      echo $this->var; // funker fint
  }
}

Endret av hockey500
Lenke til kommentar

PHP

<?php

class k1 {

   public static $var "Heisann";

   function k1Metode() {

      echo var;

   }

}

class k2 {

   function k2Metode() {

      echo k1::var;

   }

}

?>

sånn cirka. alt jeg skriver er utesta, og det skal sies at jeg har ca 2 timers erfaring med OOP i PHP

 

EDIT: okei, 3 timer. begynte når jeg leste tråden din

Endret av hockey500
Lenke til kommentar
Gjest Slettet+142

jaha.. dette kan bli morsomt.

har skrevet enormt med kode siden 21 igår. basert på å ikke kunne bruke dette :p

må jo endre fra $this->link til self::link, og $mysql->link til $mysql::link, men det er jo bare å ta en liten "Søk og Erstatt" :)

 

jeg gjør det litt senere. pga. av at nå dukket det "plutselig" opp en feilmelding som sa at den ikke fant klassen "news". den virket hele tiden, helt til jeg lastet opp til ftp-en min. noen ideer?

(Fatal error: Class 'news' not found in C:\Documents and Settings\Stein Ivar\Skrivebord\newpage\allof\functions.php on line 10)

Lenke til kommentar

både klasse-filen og "hoved-filen" er lastet opp? bruker du include() til å inkludere den? passet på at den har riktig chmod-verdi? du referer ikke til C:\ettellerannet.class.php etter at du har lastet opp, det er en typisk nybegynnertabbe (ikke det at jeg vet noe om ditt nivå). ligger de i samme mappe?

Lenke til kommentar
Gjest Slettet+142

jeg har kodet PHP i ett år nå...

OOP i 2 Mnd.

egen server, og chmod riktig satt opp.

men at det plutselig skulle klikke både på localhost og på serveren samtidig er rart :confused:

 

øverst i index.php

<?php
define("IS_INCLUDED", true);
include "all_of_php.php";
?>

 

i all_of_php.php

<?php

// all_of_php.php

if(!IS_INCLUDED) header("HTTP/1.0 404 Not Found");

include "allof/defines.php";
include "allof/functions.php";
include "allof/added.php";



?>

 

allof/defines.php får dere ikke se...

 

allof/functions.php

<?php

// functions.php


include "allof/class/mysql.php";
if(!$mysql = new mysql() ) //  die(STD_DIE);

include "allof/class/news.php";
if(!$news = new news() ) //die(STD_DIE);

include "allof/class/others.php";
if(!$others = new others() )//  die(STD_DIE);

include "allof/class/site.php";
if(!$site = new site() ) //die(STD_DIE);

?>

 

de forskjellig klasse-efinisjonene:

class mysql {
class news {
class site {
class others {

 

 

håper dette hjelper mer enn det er rotete :p

 

edit: klassen myqsl har virket helt fint hele tiden

edit: klassene "site" og "news" er de som ikke virker :(

Endret av Slettet+142
Lenke til kommentar

det var ganske merkelig ja. Har ikke noe godt svar på det der :dontgetit:

 

skriver opp en liten sjekkliste likevel:

1: chmod

2: pass på at filen faktisk blir inkludert. sjekk om du kanskje får tilgang til noe annet i filen

3: sett all relevant kode som public

4: sett error_reporting(2047); kanskje du får vite noe mer?

5: har det funka før? hva har du gjort siden den gang?

 

ellers er jeg blank for ideer.

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...