login  Naam:   Wachtwoord: 
Registreer je!
 Forum

private variable

Offline M4RtNNN - 10/11/2009 18:03
Avatar van M4RtNNNNieuw lid
  1. class a
  2. {
  3. private $thisdate;
  4.  
  5. public function __construct ()
  6. {
  7. $this->thisdate = date ( 'D d M - Y' );
  8. }
  9. }
  10.  
  11. $a = new a();
  12. echo $a->thisdate;


met deze code krijg ik een Cannot access private property a::$thisdate error, maar ik kan toch wel een private variable aanpassen in een functie en hem dan echo'n? dit werkt ook niet

  1. class a
  2. {
  3. private $thisdate = date ( 'D d M - Y' );
  4. }
  5.  
  6. $a = new;
  7. echo $a->thisdate;


wat doe ik nou fout, en vooral hoe moet het dan?  

8 antwoorden

Gesponsorde links
Offline Abbas - 10/11/2009 18:28 (laatste wijziging 10/11/2009 18:28)
Avatar van Abbas Gouden medaille

Crew .NET
Een private variabele is alleen toegankelijk via een publieke methode. Ik zal even een voorbeeld geven in C# code maar het principe geldt ook voor PHP, al ken ik die syntax niet echt.. 

  1. public class SomeClass
  2. {
  3. private string naam;
  4.  
  5. public SomeClass()
  6. {
  7. this.naam = "titjes";
  8. }
  9.  
  10. public string GetNaam()
  11. {
  12. return naam;
  13. }
  14. }
  15.  
  16. //Het gebruik
  17. SomeClass myObject = new SomeClass();
  18. string iets = myObject.GetNaam();
  19.  
  20. //Ik kan niet doen:
  21. string iets = myObject.naam;
Offline Rik - 10/11/2009 18:28
Avatar van Rik Gouden medailleGouden medaille

Crew algemeen
Het idee van private is ook dat je alleen van binnen de class zelf kunt aanpassen en uitlezen. Je zult een zogenaamde getter functie moeten maken:
  1. class a {
  2. private $thisdate;
  3. public function getDate() {
  4. return date('D d M - Y');
  5. }
  6. }
  7. $a = new a;
  8. echo $a->getDate();
Op dezelfde manier kun je setter functies gebruiken om de waarde aan te passen.
Offline Abbas - 10/11/2009 18:32
Avatar van Abbas Gouden medaille

Crew .NET
Mijn principe, maar dan in de juiste syntax! 
Offline ArieMedia - 10/11/2009 18:56
Avatar van ArieMedia Gouden medaille

PHP ver gevorderde
Wat je nog wel zou kunnen doen is met get werken, dan kan je de private ophalen

  1. class Test {
  2.  
  3. private $testvar;
  4.  
  5. public function __construct() {
  6. $this->testvar = 'test123';
  7. }
  8.  
  9. public function __get($sKey) {
  10. switch($sKey) {
  11. case 'testvar': return $this->testvar; break;
  12. }
  13. }
  14. }
Offline Richard - 10/11/2009 19:40 (laatste wijziging 10/11/2009 20:33)
Avatar van Richard Crew algemeen Maar dat is voor overloading, dat is hier niet van toepassing.

Het hele verhaal over public/protected/private is al zo vaak uitgelegd (met Google als mijn getuige), daar zal ik niet nog meer over vertellen.

Wel dat private erg onhandig is, het staat bijvoorbeeld testen in de weg. Mijn advies is daarin om sowieso nooit private te gebruiken maar protected.

En wat jij wil kan wel, maar niet helemaal zoals je het zelf probeert. Je kunt een protected/private member niet benaderen van buiten de klasse, maar wel vanuit een methode binnen dezelfde (private) of descendant (protected) klasse.

Een voorbeeld van wat sowieso niet kan bij het direct initialiseren van een member is niet-constante expressie (private $thisdate = date ( 'D d M - Y' );), dat mag gewoon niet. Dat is niet te doen voor de parser, want dit wordt bij het compilen/executen al in de klassestructuur gezet.

Wat jij dus wilt is het volgende:
  1. <?php
  2. class Test {
  3. protected $date;
  4.  
  5. public function __construct() {
  6. $this->date = new DateTime;
  7. }
  8.  
  9. public function setDate(DateTime $date) {
  10. $this->date = $date;
  11. return $this;
  12. }
  13.  
  14. public function getDate() {
  15. return $this->date;
  16. }
  17. }
  18.  
  19. $date = new Test;
  20. echo $date->getDate()->format('d-m-Y H:i:s');


Ik heb in dit (extreem simpele) voorbeeld de PHP.net: DateTime klasse gebruikt, dat werkt ook nog eens een pak simpeler dan timestamps en geformatte data. In de documentatie kun je er meer over lezen.


Ik hoop dat je iets aan dit verhaal hebt :]
Offline Abbas - 10/11/2009 20:06
Avatar van Abbas Gouden medaille

Crew .NET
1.
Je class-naam is niet juist bij het declareren van je object, dat moet Text zijn. Anders de class-naam veranderen naar Test.. 

2.
Waarom die "return $this;" bij de setDate functie? Heb je in PHP dan niet zoiets als een void?
Offline ArieMedia - 10/11/2009 20:15 (laatste wijziging 10/11/2009 20:16)
Avatar van ArieMedia Gouden medaille

PHP ver gevorderde
titjes schreef:
1.
Je class-naam is niet juist bij het declareren van je object, dat moet Text zijn. Anders de class-naam veranderen naar Test.. 

2.
Waarom die "return $this;" bij de setDate functie? Heb je in PHP dan niet zoiets als een void?


2. nee, PHP kent geen void voor zover ik weet :-)

@Richard
Overloading  , ik ben er mee bezig geweest maar volgensmij heb ik een totaal verkeerde indruk . Maar gelukkig heb ik een mooi boek gekocht waar alles over OOP in staat 
Offline Richard - 10/11/2009 20:33
Avatar van Richard Crew algemeen Nee, PHP kent geen void, maar dit doe ik voor een fluent interface. Als je dan meerdere methoden hebt die $this returnen kun je mooi $object->setDate(new DateTime)->addDit()->addDat() doen.

En die Test/Text, tsja, typfout  
Gesponsorde links
Dit onderwerp is gesloten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.305s