[PHP] OO beginnersvraagje

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hallo iedereen,

Sinds kort ben ik beginnen Object-georiënteerd programmeren in PHP (Wat ik normaal in Java doe)

Maar ik zit met volgend bizar probleem dat ik maar niet opgelost krijg. (Weet echt niet wat er fout aan is ondanks wat opzoekingswerk)

Ik heb volgend eenvoudig stukje code

PHP:
1
2
3
4
5
6
7
8
9
10
11
        <?php
            include 'domein/Driver.php';
            include 'domein/Equipe.php';

            $pilot = new Driver("Lavaert", "Mathias");
            $co_pilot = new Driver("Selie", "Peter");

            $equipe = new Equipe($pilot, $co_pilot);

            echo $equipe->__toString();
        ?>



De klasse Driver heeft gewoon twee attributen :: Naam en voornaam + een toString methode (die werkt...)
De klasse Equipe heeft twee attributen $pilot en $co_pilot + een toString methode die dezelfde methode aanroept bij de klasse Driver.

Nu krijg ik volgende foutmelding:

Fatal error: Call to a member function getName() on a non-object in C:\xampp\htdocs\Inschrijvingen\domein\Equipe.php on line 19

Klasse Equipe ::

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    class Equipe {
        private $pilot;
        private $co_pilot;
        private $car;

        public function __construct($pilot, $co_pilot) {
            $this->pilot = $pilot;
            $this->co_pilot = $co_pilot;
        }

        public function __toString() {
            return $pilot->getName();
        }

    }



Wat moet ik hiermee?

Mathias Lavaert

[ Voor 15% gewijzigd door Verwijderd op 17-08-2010 22:59 ]


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Verwijderd schreef op dinsdag 17 augustus 2010 @ 22:55:
Fatal error: Call to a member function getName() on a non-object in C:\xampp\htdocs\Inschrijvingen\domein\Equipe.php on line 19


Wat moet ik hiermee?
Beginnen met equipe.php te posten en dan vooral de code rondom regel 19 8)7

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • orf
  • Registratie: Augustus 2005
  • Nu online

orf

Ik denk dat je de classes even moet posten, of in ieder geval de relevante code.

Te laat

[ Voor 11% gewijzigd door orf op 17-08-2010 22:58 ]


Acties:
  • 0 Henk 'm!

  • InfoTracer
  • Registratie: November 2001
  • Laatst online: 14-09 19:35
Ik gok dat een var niet wordt geset met een object en dat je op die var een methode probeert uit te voeren, wat natuurlijk dan helemaal niet kan. En het kan idd rond regel 19 liggen ;)

[ Voor 12% gewijzigd door InfoTracer op 17-08-2010 23:01 ]


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
RobIII schreef op dinsdag 17 augustus 2010 @ 22:56:
[...]

Beginnen met equipe.php te posten en dan vooral de code rondom regel 19 8)7
Daar kom ik even op terug. Begin maar eens eerst met Debuggen: Hoe doe ik dat?

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Gwaihir
  • Registratie: December 2002
  • Niet online
$this->pilot->getName();

(Al heb je niet afgedwongen dat er ook echt 'n Driver in zit.)

[ Voor 57% gewijzigd door Gwaihir op 17-08-2010 23:04 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Regel 19 is regel 12 in het stukje dat ik gepast heb

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ok ja,

Nog even wennen aan de syntaxis van PHP dus :+

Acties:
  • 0 Henk 'm!

  • Gwaihir
  • Registratie: December 2002
  • Niet online
PHP kent wel type safety voor objecten. Daar zou ik zeker gebruik van maken als je specifieke methodes van zo'n Driver aanroept in de Equipe. Overigens zou ik het netter vinden de __toString() van die pilot aan te roepen dan de getName().

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Gwaihir schreef op dinsdag 17 augustus 2010 @ 23:06:
PHP kent wel type safety voor objecten. Daar zou ik zeker gebruik van maken als je specifieke methodes van zo'n Driver aanroept in de Equipe. Overigens zou ik het netter vinden de __toString() van die pilot aan te roepen dan de getName().
Normaal roep ik __toString() aan maar omdat het niet werkte heb ik vanalles geprobeert

Acties:
  • 0 Henk 'm!

  • jip_86
  • Registratie: Juli 2004
  • Laatst online: 10:16
Dat (__toString()) zal dan nu wel weer werken als je $this hebt :+

[ Voor 12% gewijzigd door jip_86 op 17-08-2010 23:18 ]


Acties:
  • 0 Henk 'm!

  • Matis
  • Registratie: Januari 2007
  • Laatst online: 14-09 17:58

Matis

Rubber Rocket

Je moet ook $this->pilot->getName(); doen, de variabele pilot valt namelijk niet binnen de scope van je functie, maar is een globaal gedefinieerde variabele.
In Java hoef je vaak niet met this te werken in dit soort gevallen, maar in PHP wel ;)

Edit; Jip }:|

[ Voor 3% gewijzigd door Matis op 17-08-2010 23:16 ]

If money talks then I'm a mime
If time is money then I'm out of time


Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
Als je PHP 5 gebruikt zou ik ook type hinting gaan gebruiken. Verder zou ik een bepaalde coding standard gaan hanteren, want het is vrij gebruikelijk om protected/private variabelen met een underscore (_) te prefixen. Dat alles voor het overzicht.

Dan krijg je dus dit:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Equipe
{ 
  private $_pilot; 
  private $_coPilot; 
  private $_car; 

  public function __construct(Driver $pilot, Driver $coPilot) 
  { 
    $this->_pilot = $pilot; 
    $this->_coPilot = $coPilot; 
  } 

  public function __toString() 
  { 
    return $this->_pilot->getName(); 
  } 
}

Acties:
  • 0 Henk 'm!

  • YopY
  • Registratie: September 2003
  • Laatst online: 13-07 01:14
HuHu schreef op woensdag 18 augustus 2010 @ 08:36:
Verder zou ik een bepaalde coding standard gaan hanteren, want het is vrij gebruikelijk om protected/private variabelen met een underscore (_) te prefixen. Dat alles voor het overzicht.
De verplichte $this-> 'prefix' geeft imho al genoeg aan dat het een private of protected variabele (class variabele) betreft, ;). Eerst de basis, dan pas beginnen met coding standaarden - ik zie weinig mis met de gebruikte in dezen.

@topic, $this-> idd. Nee het is niet logisch ($pilot wordt niet gedefinieerd in de function scope, logischerwijs zou de interpreter dan een niveau hoger (class scope) moeten kijken en als dat ook niet werkt nog eentje hoger (global scope).

Acties:
  • 0 Henk 'm!

  • ZpAz
  • Registratie: September 2005
  • Laatst online: 14-09 21:52
YopY schreef op woensdag 18 augustus 2010 @ 08:57:
[...]


De verplichte $this-> 'prefix' geeft imho al genoeg aan dat het een private of protected variabele (class variabele) betreft, ;). Eerst de basis, dan pas beginnen met coding standaarden - ik zie weinig mis met de gebruikte in dezen.
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
class Foo {
    private $_bar;
    public $bar;

    function doFoo() {
        echo $this->_bar; //Werkt
        echo $this->bar; //Werkt
    }
}

$fooBar = new Foo();
echo $fooBar->bar; //Public
echo $fooBar->_bar; //Private werkt dus niet


Enkel $this geeft nog niet aan dat het binnen de private of protected scope valt. Dan kan het nog net prima een public var zijn.

Tweakers Time Machine Browser Extension | Chrome : Firefox


Acties:
  • 0 Henk 'm!

  • Hipska
  • Registratie: Mei 2008
  • Laatst online: 08-09 09:58
En nog even melden dat je ook gewoon echo $equipe; kunt doen. __toString is een magic method.

Acties:
  • 0 Henk 'm!

  • Gwaihir
  • Registratie: December 2002
  • Niet online
ZpAz in "[PHP] OO beginersvraagje"
Enkel $this geeft nog niet aan dat het binnen de private of protected scope valt. Dan kan het nog net prima een public var zijn.
Die _ is een erfenis van PHP4 waarin private en protected niet bestond. Op die manier gaf je aan dat het als niet public beschouwd moest worden. In PHP5 is dat niet meer nodig daar het in de taal zit.

Publieke class variables hoor je eigenlijk nooit te hebben. Dus, wil je die toch onderscheiden, dan zou ik juiste die enkele publieke een prefix geven. (Iets als "todo" wellicht? ;) )

[ Voor 4% gewijzigd door Gwaihir op 18-08-2010 10:10 ]


Acties:
  • 0 Henk 'm!

  • ZpAz
  • Registratie: September 2005
  • Laatst online: 14-09 21:52
Gwaihir schreef op woensdag 18 augustus 2010 @ 10:09:
[...]

Die _ is een erfenis van PHP4 waarin private en protected niet bestond. Op die manier gaf je aan dat het als niet public beschouwd moest worden. In PHP5 is dat niet meer nodig daar het in de taal zit.

Publieke class variables hoor je eigenlijk nooit te hebben. Dus, wil je die toch onderscheiden, dan zou ik juiste die enkele publieke een prefix geven. (Iets als "todo" wellicht? ;) )
True, in andere talen moet je vaak expliciet getters en setters aanmaken. Bij PHP heb je wel 'magic' methods __get() en __set() waarmee je wel bepaalde functionaliteit kan uitvoeren als je dat wil als een variabele 'geset' of 'geget' wordt.

Tweakers Time Machine Browser Extension | Chrome : Firefox


Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Je hebt gelijk, maar toch kan die conventie geen kwaad. :P

{signature}


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

HuHu schreef op woensdag 18 augustus 2010 @ 08:36:
Als je PHP 5 gebruikt zou ik ook type hinting gaan gebruiken. Verder zou ik een bepaalde coding standard gaan hanteren, want het is vrij gebruikelijk om protected/private variabelen met een underscore (_) te prefixen. Dat alles voor het overzicht.
Zo gebruikelijk is het ook weer niet hoor. Ik kan zelf dat soort prefixes bijvoorbeeld niet lijden. Ze slaan nergens op, omdat een goeie editor ze toch niet als optie ziet en je waarschuwt als je ze wil gebruiken. Bovendien gebruik je als het goed is inderdaad meer private en protected members dan public members, dus zou ik áls je dan al dingen wil prefixen, dat inderdaad vooral bij public variabelen doen omdat die de uitzondering zijn, niet de afgeschermde variabelen. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
NMe schreef op woensdag 18 augustus 2010 @ 12:42:
[...]

Zo gebruikelijk is het ook weer niet hoor. Ik kan zelf dat soort prefixes bijvoorbeeld niet lijden. Ze slaan nergens op, omdat een goeie editor ze toch niet als optie ziet en je waarschuwt als je ze wil gebruiken. Bovendien gebruik je als het goed is inderdaad meer private en protected members dan public members, dus zou ik áls je dan al dingen wil prefixen, dat inderdaad vooral bij public variabelen doen omdat die de uitzondering zijn, niet de afgeschermde variabelen. :)
In PHP is het niet direct noodzakelijk, maar in andere talen is het wel handig. Het kan volgens mij geen kwaad om het je aan te leren.

PHP:
1
2
3
4
5
6
7
8
9
10
11
class Iets {
  private $x;

  public function getX() {
    return $this->x;
  }

  public function setX($x) {
    $this->x = $x;
  }
}
Java:
1
2
3
4
5
6
7
8
9
10
11
public class Iets {
  private int x;

  public int getX() {
    return x;
  }

  public void setX(int x) {
    this.x = x;
  }
}


In PHP moet je de $this-> gebruiken, maar in Java is dat niet per se noodzakelijk. Het prefixen met een _ maakt het dan wel duidelijker of het om een variabele binnen de class-scope of function-scope gaat (en je kunt niet ook niet vergissen). In C++ wordt het dan nog leuker:

C++:
1
2
3
4
5
6
7
8
9
class Iets {
private:
  int x;

public:
  int getX() const { return x; }

  void setX(int xx) { x = xx; }
}


Opeens moet je de parameter van setX een andere naam geven, want je kunt hem geen x meer noemen. Dan vind ik het duidelijker als er dit staat:

C++:
1
void setX(int x) { _x = x; }


Als je dan jezelf aanleert altijd met een _ te prefixen (of nog beter: te suffixen, want dan heb je geen botsingen met bestaande functies als _main en _exit), dan kan dat zeker geen kwaad.

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Zowel in C++ als in Java heb je daar "this" voor en die gebruik ik 1000 keer liever expliciet dan dat ik met underscores moet gaan werken. Daarom: leg niet aan anderen jouw persoonlijke voorkeuren als absolute waarheid op. ;)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 01:28

.oisyn

Moderator Devschuur®

Demotivational Speaker

HuHu schreef op woensdag 18 augustus 2010 @ 15:25:
(of nog beter: te suffixen, want dan heb je geen botsingen met bestaande functies als _main en _exit)
Sinds wanneer kan een lokale variabele of member botsen met een globale functie?

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • Gwaihir
  • Registratie: December 2002
  • Niet online
HuHu schreef op woensdag 18 augustus 2010 @ 15:25:
[...]

In PHP is het niet direct noodzakelijk, maar in andere talen is het wel handig. Het kan volgens mij geen kwaad om het je aan te leren.

In PHP moet je de $this-> gebruiken, maar in Java is dat niet per se noodzakelijk. Het prefixen met een _ maakt het dan wel duidelijker of het om een variabele binnen de class-scope of function-scope gaat (en je kunt niet ook niet vergissen).
Volgens die logica zou je variabelen in java dan wellicht ook met een $ moeten beginnen; dat maakt het wel duidelijker dat het om een variabele gaat. Ondertussen ben je erg ver van de standaard java code convention van Sun, welke camelCasing voorschrijft, zonder underscores. Die conventie vind ik een stuk belangrijker.

Bovendien gebruik ik liever (in zowel PHP als Java) mijn editor (eclipse), die het allemaal netjes weergeeft d.m.v. syntax highlighting met aparte kleuren voor lokale en klasse variabelen, dan een conventie waarvan ik als ik code lees nooit zeker weet of hij geheel gevolgd is of niet.

Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
.oisyn schreef op woensdag 18 augustus 2010 @ 17:12:
[...]

Sinds wanneer kan een lokale variabele of member botsen met een globale functie?
Ik heb dat uit de JSF Air Vehicle C++ Coding Standards:
AV Rule 47:
Identifiers will not begin with the underscore character ‘_’.

Rationale: ‘_’ is often used as the first character in the name of library functions (e.g. _main, _exit, etc.) In order to avoid name collisions, identifiers should not begin with ‘_’.
Ben het zelf nog niet in de praktijk tegengekomen eerlijk gezegd, dus heb er geen ervaring mee.
Pagina: 1