[PHP/OOP] Theoretische vraag - begrijp werking niet

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ik heb een klasse die alle basic functies van een website afhandelt.
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
class core {
   function breadcrumbs() {
     print ...
   }

   function sitemap() {
      print ...
   }

   function content() {
      require_once("content-file");
   }
}


Ik kan alle functies kan aanroepen als
PHP:
1
$core->function();


Vreemdgenoeg lukt dit alleen maar tot ik de content aangeroepen heb.
PHP:
1
$core->content();


Na de content moet ik mijn functies oproepen met $this->
PHP:
1
$this->function();


Als ik mijn klasse aanpas, kan ik alle functies terug aanroepen met $core->
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class core {
   function breadcrumbs() {
     print ...
   }

   function sitemap() {
      print ...
   }

   function content() {
      return("content-file");
   }
}

require_once($core->content());


Mijn klasse en content-files zitten in verschillende mappen.

Kan iemand mij uitleggen hoe het komt dat ik in het eerste geval $this-> moet gebruiken en in het tweede $core->. Gewoon, zodat ik mijn code beter begrijp :)

edit:

Ben net opgebeld door mijn werk. Moet even ter plaatse gaan. Het kan dus even duren eer ik antwoord kan geven op vragen...

[ Voor 6% gewijzigd door Verwijderd op 25-07-2007 10:47 ]


Acties:
  • 0 Henk 'm!

Verwijderd

$this gebruik je in de klasse zelf, dat is een pointer naar het huidige object. Als je $core wil gebruiken moet je eerst een core object aanmaken. Als je een functie wil aanspreken die geen object nodig hebt gebruik je (dacht ik) core::functie();

Helpt dit wat?

Acties:
  • 0 Henk 'm!

  • Mr. Bondt
  • Registratie: Februari 2005
  • Laatst online: 27-08 14:50
$this gebruik je in de class zelf, om methods (functions in de class) of properties (variables in de class) te bereiken.
$core gebruik je op alle andere plaatsen.

edit:
Sneller typen.

[ Voor 7% gewijzigd door Mr. Bondt op 25-07-2007 11:03 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Als je een functie wil aanspreken die geen object nodig hebt gebruik je (dacht ik) core::functie();
@TS: dat zijn dus static objecten.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class Core
{
    private $leeftijd = 0;

    public function Fiets()
    {
        echo 'lekker fatsen';
        $this->leeftijd = 10;
    }

    public function GetLeeftijd()
    {
        return $this->leeftijd;
    }
    public static function Loop()
    {
         echo 'lekker lopen';
   }

// instantie nodig voor Fiets()
$CoreObject = new Core();
$CoreObject->Fiets();
$CoreObject->GetLeeftijd();

// geen instantie nodig voor Loop()
Core::Loop();


[/code]

[ Voor 14% gewijzigd door Verwijderd op 25-07-2007 12:13 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ik maak een $core object aan.
Ik heb een index-file waar de content in geparsed wordt:
PHP:
1
2
3
4
5
6
7
8
9
10
$core = new core();
$core->navigatie();
$core->title();
$core->breadcrumbs();
$core->content
// ----------------------------------
// vanaf hier werkt $core->functie() niet meer en moet ik $this->functie gebruiken
// ook functies die ik boven $core->content() gebruikt heb, moeten nu plots met $this->
// ----------------------------------
$this->breadcrumbs(); // en dus niet $core->breadcrumbs


En dat begrijp ik dus niet :)

@Worteltaart:
wanneer gebruik ik een gewone functie en wanneer een static?

Acties:
  • 0 Henk 'm!

  • mithras
  • Registratie: Maart 2003
  • Niet online
Sowieso klopt er al iets niet aangezien content een functie is (en je dus $core->content() zou moeten gebruiken), en je returned de content, dus ik neem aan dat je die wil opvangen (en dus $content=$core->content() moet gebruiken) :)

Static functies en objects aanroepen zonder instantie is php5, dus als je nog met php4 werkt gaat je dat iig niet lukken.

[ Voor 21% gewijzigd door mithras op 25-07-2007 12:20 ]


Acties:
  • 0 Henk 'm!

  • P.O. Box
  • Registratie: Augustus 2005
  • Niet online
Verwijderd schreef op woensdag 25 juli 2007 @ 12:16:
ik maak een $core object aan.
Ik heb een index-file waar de content in geparsed wordt:
PHP:
1
2
3
4
5
6
7
8
9
10
$core = new core();
$core->navigatie();
$core->title();
$core->breadcrumbs();
$core->content
// ----------------------------------
// vanaf hier werkt $core->functie() niet meer en moet ik $this->functie gebruiken
// ook functies die ik boven $core->content() gebruikt heb, moeten nu plots met $this->
// ----------------------------------
$this->breadcrumbs(); // en dus niet $core->breadcrumbs


En dat begrijp ik dus niet :)

@Worteltaart:
wanneer gebruik ik een gewone functie en wanneer een static?
ik vind deze sowieso niet zo handig:
PHP:
1
$core = new core();

kies voor je variabele of voor je classe een andere naam...

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
@mithras
In de huidige werkwijze (waar het probleem van $core / $this zich voordoet), geef ik geen value terug voor $content, maar include ik die vanuit de core()

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
$core = new core();

class core {
   function breadcrumbs() {
     print ...
   }

   function sitemap() {
      print ...
   }

   function content() {
      require_once("content-file");
   }
}
?>


Pas als ik de klasse aanpas naar deze code, kan ik altijd $core gebruiken, maar moet ik wel require_once($core->content() gebruiken in mijn index-file.
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$core = new core(),
class core {
   function breadcrumbs() {
     print ...
   }

   function sitemap() {
      print ...
   }

   function content() {
      return("content-file");
   }
}

require_once($core->content());
?>

Acties:
  • 0 Henk 'm!

Verwijderd

Nou wat ik zelf bijvoorbeeld heb is een utility class, in deze klasse staan wat functies die variabelen kunnen matchen aan een regexp.

PHP:
1
2
3
4
public static function CheckZipCode($string)
{
    // bla
}


Wat je in je programma dan kunt aanroepen als
PHP:
1
2
3
4
if(Validator::CheckZipCode("1122AB"))
{
    // bla
}


Je gebruikt het dus wanneer het niet nodig of wenselijk is om een instantie te creeren.

[ Voor 11% gewijzigd door Verwijderd op 25-07-2007 12:24 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Waarom wordt hier nergens het woordje "scope" genoemd? Dat is wat in wezen het probleem is hier.

Als die require_once wordt uitgevoerd binnen een method -en dat is hier aan de orde- dan is de scope van het object de standaard scope, en in dit geval moet je dus $this gebruiken om de properties/methods van die instantie te benaderen, omdat $core binnen de object scope niet bestaat.

De rest (het static/non-static gebeuren) is in dit geval even allemaal bijzaak.

[ Voor 14% gewijzigd door Verwijderd op 25-07-2007 12:29 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
dus de enige manier om altijd $core te moeten gebruiken, is door voorbeeld twee te gebruiken en de require(_once) uit de klasse te halen?

Acties:
  • 0 Henk 'm!

Verwijderd

Verwijderd schreef op woensdag 25 juli 2007 @ 12:30:
dus de enige manier om altijd $core te moeten gebruiken, is door voorbeeld twee te gebruiken en de require(_once) uit de klasse te halen?
Nee hoor, je kunt in de method, direct voor de require_once het volgende doen:
PHP:
1
2
3
4
function content() {
   $core = &$this;
   require_once("content-file");
}

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Verwijderd schreef op woensdag 25 juli 2007 @ 12:33:
[...]

Nee hoor, je kunt in de method, direct voor de require_once het volgende doen:
PHP:
1
2
3
4
function content() {
   $core = &$this;
   require_once("content-file");
}
smart one :)
and it works!!!

Acties:
  • 0 Henk 'm!

Verwijderd

Iets zegt me overigens dat dit niet helemaal een juiste manier van werken is. Ik weet niet wat er precies in het bestand staat dat je aan het includen bent (met de require_once() functie) maar helemaal fraai ziet het er in ieder geval niet uit. Ook niet met de oplossing van Cheatah..

?

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
De website bouwt automatisch de navigatiestructuur op met mooie urls.
Mijn bestanden staan in mappen die beginnen met nummers (zowel mappen als bestanden)
code:
1
2
3
4
5
6
7
1_een-map
   |- 1_map
   |   |- 1_bestand.php
   |- 2_bestand.php
2_nog-een-map
   |- 1_leuk-bestandje.php 
3_bestand


Ik moet dus mijn mooie urls matchen met mijn vuile bestandsstructuur.
Er gebeuren allemaal leuke dingen en uiteindelijk weet de website (op basis van de url) welk bestand nodig is.

code:
1
2
/een-map/map/bestand/        => /1_een-map/1_map/1_bestand.php        = require_once($content)
/nog-een-map/leuk-bestandje/ => /2_nog-een-map/1_leuk-bestandje.php   = require_once($content)

[ Voor 13% gewijzigd door Verwijderd op 25-07-2007 12:48 . Reden: code-wrapping ]


Acties:
  • 0 Henk 'm!

Verwijderd

Ach, ik vind het ook niet mooi, maar in dit geval werkt het, en ik hoop dat nu duidelijk is wat "scope" precies inhoudt. Ik zou m'n applicatie ook niet zo hebben ontworpen.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Als ik het begrijp (ben wat gaan lezen online) ben ik stom bezig om mijn functies aan te roepen als $core-> omdat ik van elk object toch maar een instance nodig heb.

Beter zou ik alles aanroepen met Core::

In een ander geval, waar ik verschillende instances van hetzelfde object (met andere parameters) nodig heb, gebruik ik
PHP:
1
2
3
4
5
$instance1 = new class();
$instance2 = new class();

$instance1->setName("Tweakers");
$instance2->setName("GOT");


klopt dit zo'n beetje?

Acties:
  • 0 Henk 'm!

  • WormLord
  • Registratie: September 2003
  • Laatst online: 10:10

WormLord

Devver

Wat staat er eigenlijk in die "content-file"? Want dat is volgens mij wat dit gedrag veroorzaakt.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
content-file is gewoon een phpfile met (x)html code in. Waar eventueel nog wat kinky php-code in kan gepleurd worden.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
            <p>
               NO-SPAM sierpleister kan zowel op oude als op nieuwe gevels aangebracht worden. Ook geschilderde gevels en gevels opgetrokken in cellenbeton komen in aanmerking voor deze behandeling.
            </p>

            <p>
               <a href="#">De ondergrond moet glad zijn.</a> Is dat niet het geval dan moet de ondergrond eerst ge&euml;galiseerd worden. Dit gebeurt best met een egalisatiemodel <span class="highlight">NO-SPAM</span> Egalon C-995 of met een aangepaste cementering.
            </p>
            <p>
              NO-SPAM Sierpleister bestaat uit kwartskorrels of marmerkorrels, vezels, harsen, bindmiddelen en kleurstof. Deze kleurstof kan bestaan uit een speciale acrylaatverf (<span class="highlight">NO-SPAM</span> C-999) of uit een volledig natuurlijk en mineraal marmerpoeder (<span class="highlight">NO-SPAM</span> C997). De dikte van de korrels varieert van 1 mm tot 2,5 mm.
            </p>

            <img src="sierpleister_1.gif" alt="blah blah" />

            <p>
               NO-SPAM Sierpleister heeft een grote weerstand tegen alcali&euml;n en weersinvloeden allerhande. NO-SPAM Sierpleister is elastisch en bestand tegen vorst.
            </p>
            <p>
               NO-SPAM Sierpleister wordt niet gespoten maar met een speciaal pleisterspaan uitgesmeerd. Deze werkwijze komt zowel de duurzaamheid als het uitzicht ten goede. NO-SPAM Sierpleister is bijzonder goed geschikt voor buiten maar kan natuurlijk ook op binnenmuren aangebracht worden
            </p>
            <p>
               De muren krijgen dan een rustiek uitzicht in vele verschillende tinten.
            </p>

            <img src="sierpleister_2.gif" alt="blah blah" />

            <p>
               NO-SPAM Sierpleister is verkrijgbaar in verschillende tinten.
            </p>
            <p>
               In een 2.5 korrel kunt u kiezen uit wit (933), platinawit (932), ivoor (212), antraciet (837), lichtgroen (640), mosselgrijs (831), zandkleur (728).
            </p>
            <p>
               In een 1 mm korel kunnen we u Franse steen (VE), ivoor (VE 507), zandkleur (VE 4), grijs (VE 1601), perzik (VE 509), zalm (VE 1608), oker( VE 926), lichtzalm (VE 925) aanbieden.
            </p>
            <p>
               Per m&sup2; mag u rekenenen op een verbruik van 2 &agrave; 3 kg naargelang de manier van aanbrengen en de gebruikte sierpleister.
            </p>
            <p>
               Op eenvoudig verzoek krijgt u van <span class="highlight">NO-SPAM</span> een gratis en vrijblijvend prijsbestek.
            </p>

[ Voor 3% gewijzigd door Verwijderd op 26-07-2007 10:37 . Reden: Teksten niet geschreven door /me :) ]

Pagina: 1