[php] OO; object retourneert array, elementen toegankelijk?

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Het volgende stukje code:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class myclass 
  {
    var $myarray;
    var $selectedelement;
   
    function setarray( $req_myarray ) { $this->myarray = $req_myarray; }
    function getarray() { return $this->myarray; }
   
    function setselectedelement( $req_selectedelement ) { $this->selectedelement = $req_selectedelement; }
    function getselectedelement() { return $this->selectedelement ; }

    function myclass() 
      {
      }
  }


in php maak ik een instance aan van deze class, en ken een array toe:

PHP:
1
2
  var $arr = new ( myarray );
  $arr-> setarray( array( 'hello' , 'world' ) );


nu wil ik iets in het selectedelement kunnen zetten, en indien deze waarde niet in de array 'myarray' voorkomt, moet selectedelement de waarde krijgen van het eerste element uit 'myarray'. Ik zou zeggen dat dat zo moet kunnen:

PHP:
1
2
3
4
 $arr -> setselectedelement( 'onzin' );
 if (!in_array( $arr->getselectedelement(), $arr->getarray() )
    { $arr->setselectedelement( $arr->getarray[0] );
    }


dit werkt echter niet. de enige manier die ik tot nu toe heb kunnen vinden, om dit te doen, is:

PHP:
1
2
3
4
5
 $arr -> setselectedelement( 'onzin' );
 if (!in_array( $arr->getselectedelement(), $arr->getarray() )
    { $firstelement = $arr->getarray();
       $arr->setselectedelement( $arr->$firstelement[0] );
    }


Dit vind ik echter niet fraai.. hoe doe ik dit zonder tussenvariabele?

Ik heb wat getest:
PHP:
1
2
3
4
5
6
  echo $arr->getarray[0]
  // levert op : een lege string
  echo $arr->getarray()
  // levert op : de hele array
  echo $arr->getarray()[0]
  // levert op : foutmelding

[ Voor 12% gewijzigd door Verwijderd op 13-02-2005 13:13 ]


Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
PHP:
1
2
3
4
function getItem($index)
{
  return $this->myarray[$index];
}

en dan
PHP:
1
$arr->getItem(0);


Zoiets? Verder kan ik je ook erg aanraden om -of underscores te gebruiken tussen woorden -of camelCaps of what ever. getselectedelement is vrij moeilijk leesbaar vergeleken met getSelectedElement imo.

[ Voor 7% gewijzigd door Michali op 13-02-2005 13:29 ]

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Michali schreef op zondag 13 februari 2005 @ 13:29:
PHP:
1
2
3
4
function getItem($index)
{
  return $this->myarray[$index];
}

en dan
PHP:
1
$arr->getItem(0);


Zoiets?
Ik denk niet echt, immers nu kan je niet meer de hele array ophalen, maar alleen elementen uit die array, maw:

PHP:
1
2
 $test = $arr->getitem();
 echo $text[0]


kan dan niet meer, toch?
Verder kan ik je ook erg aanraden om -of underscores te gebruiken tussen woorden -of camelCaps of what ever. getselectedelement is vrij moeilijk leesbaar vergeleken met getSelectedElement imo.
uiteraard, ik had snel even een voorbeeldje in elkaar geflanst voor op GoT.. de echte code maakt wel gebruik van Caps..

Hoe vertel ik in PHP dat een bepaalde variabele een array moet zijn? Als ik bv. dit doe:

PHP:
1
2
3
4
5
6
7
8
9
10
11
  class myclass 
    { var $array;
       
       function setarray($req_array) { this -> array = $req_array; }

       function inarray ($item) { return in_array($item, $array) };
    }

   $arrayclass = new(myclass);
   $arrayclass->setarray( array( 'hello', 'world' ) );
   $arrayclass->inarray('blaat');


Als ik dit uitvoer krijg ik als foutmelding:
code:
1
Warning: in_array(): Wrong datatype for second argument [..]

[ Voor 7% gewijzigd door Verwijderd op 13-02-2005 13:41 ]


Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
Verwijderd schreef op zondag 13 februari 2005 @ 13:39:
[...]


Ik denk niet echt, immers nu kan je niet meer de hele array ophalen, maar alleen elementen uit die array, maw:

PHP:
1
2
 $test = $arr->getitem();
 echo $text[0]


kan dan niet meer, toch?
Wie houdt je tegen om beide functies binnen de class te zetten :? Je hoeft toch niet perse te kiezen lijkt me? Gewoon de juiste functie schrijven voor iedere soort actie die je wilt uitvoeren.
uiteraard, ik had snel even een voorbeeldje in elkaar geflanst voor op GoT.. de echte code maakt wel gebruik van Caps..

Hoe vertel ik in PHP dat een bepaalde variabele een array moet zijn? Als ik bv. dit doe:

PHP:
1
2
3
4
5
6
7
8
9
10
11
  class myclass 
    { var $array;
       
       function setarray($req_array) { this -> array = $req_array; }

       function inarray ($item) { return in_array($item, $array) };
    }

   $arrayclass = new(myclass);
   $arrayclass->setarray( array( 'hello', 'world' ) );
   $arrayclass->inarray('blaat');


Als ik dit uitvoer krijg ik als foutmelding:
code:
1
Warning: in_array(): Wrong datatype for second argument [..]
PHP:
1
return in_array($item, $array)
moet
PHP:
1
return in_array($item, $this->array)
zijn.. (beetje basic dit hoor)

[ Voor 5% gewijzigd door Michali op 13-02-2005 13:45 ]

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

(jarig!)
Verwijderd schreef op zondag 13 februari 2005 @ 13:39:
Hoe vertel ik in PHP dat een bepaalde variabele een array moet zijn? Als ik bv. dit doe:
Er zit natuurljk een verschil tussen $array en $this->array...

Overigens moet voor goed OO je uiteraard die code die met het setSelectedElement werkt in de klasse stoppen, niet buiten de klasse om met het array werken. Let er trouwens op dat PHP4 standaard de objecten "by value" meestuurt, waardoor je niet perse hetzelfde object bewerkt als je op een andere plaats doet. Ik geloof dat dat in dit geval niet aan de orde is.

Acties:
  • 0 Henk 'm!

  • Koeniepoenie
  • Registratie: Oktober 2003
  • Laatst online: 15-09 21:46
Michali schreef op zondag 13 februari 2005 @ 13:44:
[...]

PHP:
1
return in_array($item, $array)
moet
PHP:
1
return in_array($item, $this->array)
zijn.. (beetje basic dit hoor)
En je kunt natuurlijk eerst ook nog checken mbv is_array() om uberhaupt die foutmelding te voorkomen.

Parse error: syntax error, unexpected GOT_USER in https://gathering.tweakers.net on line 1337


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Michali schreef op zondag 13 februari 2005 @ 13:44:
Wie houdt je tegen om beide functies binnen de class te zetten :? Je hoeft toch niet perse te kiezen lijkt me? Gewoon de juiste functie schrijven voor iedere soort actie die je wilt uitvoeren.
Het leek me dat dat niet nodig was.. dit zou inhouden dat je voor alle members die array zijn, nog aparte functies moet maken om elementen uit die array op te halen. Dat lijkt mij redelijk overbodig, als je al een functie hebt waarmee je de array zelf ophaalt, toch?

Jij stelt dan dus zoiets voor (?)

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class myclass  
  { 
    var $myarray; 
    var $selectedelement; 
    
    function setarray( $req_myarray ) { $this->myarray = $req_myarray; } 
    function getarray() { return $this->myarray; } 

    function getarrayelement($index) { return $this->myarray[$index] };
    
    function setselectedelement( $req_selectedelement ) { $this->selectedelement = $req_selectedelement; } 
    function getselectedelement() { return $this->selectedelement ; } 

    function myclass()  
      { 
      } 
  }
moet
PHP:
1
return in_array($item, $this->array)
zijn.. (beetje basic dit hoor)
Zonder meer basic, ik weet het. Ik ben van oorsprong delphi programmeur en daar is OO wat beter geregeld allemaal.

Toch; ook al is het basic; zie dit maar eens te vinden met google.. ik kom echt niet als eerste hier vragen..

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ACM schreef op zondag 13 februari 2005 @ 13:47:
Overigens moet voor goed OO je uiteraard die code die met het setSelectedElement werkt in de klasse stoppen, niet buiten de klasse om met het array werken. Let er trouwens op dat PHP4 standaard de objecten "by value" meestuurt, waardoor je niet perse hetzelfde object bewerkt als je op een andere plaats doet. Ik geloof dat dat in dit geval niet aan de orde is.
Dat heb ik inderdaad al gedaan, ik heb nu dit:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class myclass 
  {
    var $myarray;
    var $selectedelement;
   
    function setarray( $req_myarray ) { $this->myarray = $req_myarray; }
    function getarray() { return $this->myarray; }
   
    function setselectedelement( $req_selectedelement ) 
      { $this->selectedelement = $req_selectedelement; 
         if (!in_array( $this->selectedelement, $this->myarray))
          { $this->selectedelement = $this->myarray[0]; }
      }
    function getselectedelement() { return $this->selectedelement ; }

    function myclass() 
      {
      }
  }


nou ja, in het echt niet helemaal, daar voer ik wel een is_array check uit etc..

Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
Verwijderd schreef op zondag 13 februari 2005 @ 13:51:
[...]


Het leek me dat dat niet nodig was.. dit zou inhouden dat je voor alle members die array zijn, nog aparte functies moet maken om elementen uit die array op te halen. Dat lijkt mij redelijk overbodig, als je al een functie hebt waarmee je de array zelf ophaalt, toch?
Dat breekt encapsulation behoorlijk lijkt me. Dan kun je net zo goed direct procedureel gaan programeren als je al zo'n instelling hebt. Bewerkingen op members van een object hoor je gewoon te verbergen voor de client. Scheelt je ook weer werk als je zo'n actie op meerdere plaatsen wilt uitvoeren. En je code wordt er wat leesbaarder en duidelijk door imo.
Jij stelt dan dus zoiets voor (?)

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class myclass  
  { 
    var $myarray; 
    var $selectedelement; 
    
    function setarray( $req_myarray ) { $this->myarray = $req_myarray; } 
    function getarray() { return $this->myarray; } 

    function getarrayelement($index) { return $this->myarray[$index] };
    
    function setselectedelement( $req_selectedelement ) { $this->selectedelement = $req_selectedelement; } 
    function getselectedelement() { return $this->selectedelement ; } 

    function myclass()  
      { 
      } 
  }
Als het meerdere keren voorkomt in je code, dan kun je het beste een aparte wrapper class schrijven voor een array. Die zou je dan in zijn geheel kunnen returnen of functies schrijven die delegaten naar de wrapper.
Zonder meer basic, ik weet het. Ik ben van oorsprong delphi programmeur en daar is OO wat beter geregeld allemaal.

Toch; ook al is het basic; zie dit maar eens te vinden met google.. ik kom echt niet als eerste hier vragen..
Ik doelde meer op de foutmelding, die lijkt me behoorlijk duidelijk en is ook vrij simpel te debuggen.

[ Voor 12% gewijzigd door Michali op 13-02-2005 14:01 ]

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Michali schreef op zondag 13 februari 2005 @ 13:58:
Als het meerdere keren voorkomt in je code, dan kun je het beste een aparte wrapper class schrijven voor een array. Die zou je dan in zijn geheel kunnen returnen of functies schrijven die delegaten naar de wrapper.
Zit ik dan niet workarounds te coden voor fouten in php? Als ik in delphi doe:

Delphi:
1
2
3
4
function getArray : array [1 .. 5] of string
  begin
     Result:= MyArray;
  end


kan ik daarna gewoon doen:

code:
1
  showmessage( getArray[3] );
Ik doelde meer op de foutmelding, die lijkt me behoorlijk duidelijk en is ook vrij simpel te debuggen.
Nou imo niet. Immers in het object heb ik var $items gedefinieerd, en er een array aan toegekend. Het is dan voor mij (als delphi programmeur) ook niet helder waarom $items volgens hem geen array is.

Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
Verwijderd schreef op zondag 13 februari 2005 @ 14:03:
[...]


Zit ik dan niet workarounds te coden voor fouten in php? Als ik in delphi doe:

Delphi:
1
2
3
4
function getArray : array [1 .. 5] of string
  begin
     Result:= MyArray;
  end


kan ik daarna gewoon doen:

code:
1
  showmessage( getArray[3] );
Fouten in php? Ik zie nergens een fout. Het is mischien niet mogelijk, maar niet echt een fout in php. En idd, je maakt tools die de taal zelf nog niet beschikbaar stelt. Maar dat is wat programeren in princiepe is ;)
Nou imo niet. Immers in het object heb ik var $items gedefinieerd, en er een array aan toegekend. Het is dan voor mij (als delphi programmeur) ook niet helder waarom $items volgens hem geen array is.
$items? Die ben ik nog niet tegen gekomen. Het ging meer om $array die gewoon $this->array moet zijn. Lijkt me vrij simpel te zien, zeker als de regel nummer wordt gegeven, de functie naam, en om welk argument het gaat.

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Michali schreef op zondag 13 februari 2005 @ 14:07:
Fouten in php? Ik zie nergens een fout. Het is mischien niet mogelijk, maar niet echt een fout in php. En idd, je maakt tools die de taal zelf nog niet beschikbaar stelt. Maar dat is wat programeren in princiepe is ;)
:P.. ik bedoel het volgende..
code:
1
2
3
4
var $array

function getarray () { return $this -> array ; }
function setarray ($req_array) { $this -> array = $req_array; }


ik was nu in de veronderstelling dat binnen die class $this-> array equivalent is aan $array, maw. met setarray zet je de waarde van $array.
$items? Die ben ik nog niet tegen gekomen. Het ging meer om $array die gewoon $this->array moet zijn. Lijkt me vrij simpel te zien, zeker als de regel nummer wordt gegeven, de functie naam, en om welk argument het gaat.
Verwarring doordat ik de verkeerde varnaam gebruikte.. ik bedoel idd $array.

Wat ik fout vind, is met $this->getarray, haal ik duidelijk een array op. Dan moet $this->getarray[0] imo het eerste element uit die array retourneren..

Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
Verwijderd schreef op zondag 13 februari 2005 @ 14:13:
[...]


:P.. ik bedoel het volgende..
code:
1
2
3
4
var $array

function getarray () { return $this -> array ; }
function setarray ($req_array) { $this -> array = $req_array; }


ik was nu in de veronderstelling dat binnen die class $this-> array equivalent is aan $array, maw. met setarray zet je de waarde van $array.
Dat moet je net even weten dan.
Verwarring doordat ik de verkeerde varnaam gebruikte.. ik bedoel idd $array.

Wat ik fout vind, is met $this->getarray, haal ik duidelijk een array op. Dan moet $this->getarray[0] imo het eerste element uit die array retourneren..
In php (en alle c syntax stijl talen, dacht ik) moet een functie met haken worden aangeroepen. $this->getarray is dus een access call naar een member en $this->getarray() is een method call. Verder doet php 4 niet aan dereferencing. $object->method1()->method2() kan dus niet. php 5 is daar al een stuk beter in. Zie je geen kans om daar mee te gaan werken? Het hele OO model daar is ook veeeel beter.

Verder zie ik nog steeds niet zo het probleem van een extra functie. Het lijkt me een kleine moeite om die even toe te voegen.

[ Voor 11% gewijzigd door Michali op 13-02-2005 14:21 ]

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Michali schreef op zondag 13 februari 2005 @ 14:18:
In php (en alle c syntax stijl talen, dacht ik) moet een functie met haken worden aangeroepen. $this->getarray is dus een access call naar een member en $this->getarray() is een method call.
Accoord, daar was ik inmiddels achter gekomen.. ik stel mijn vragen soms wat onhandig, omdat het mij om het principe gaat en niet over de exacte uitwerking.
Verder doet php 4 niet aan dereferencing. $object->method1()->method2() kan dus niet.
Denk dat daar idd mijn probleem zit.
php 5 is daar al een stuk beter in. Zie je geen kans om daar mee te gaan werken? Het hele OO model daar is ook veeeel beter.
Helaas..

Het volgende snap ik dus echt niet:

PHP:
1
2
3
4
5
6
7
8
9
10
  class myclass
     { var $MyArray;
         
        function setMyArray ($req_MyArray)  { $this->MyArray = $req_MyArray;}
        function testarray() { return is_array ($this ->MyArray) }
     }
[..]
  $arr = new myclass;
  $arr -> setMyArray(array('hello','world'));
  echo $arr->testarray();


bovenstaande voorbeeldje print 'false'. Ik stop dus heel duidelijk een array in $this->MyArray, maar een is_array ($this->MyArray) claimed toch dat het geen array is..

?!

[ Voor 16% gewijzigd door Verwijderd op 13-02-2005 14:29 ]


Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
Verwijderd schreef op zondag 13 februari 2005 @ 14:25:
[...]


Accoord, daar was ik inmiddels achter gekomen.. ik stel mijn vragen soms wat onhandig, omdat het mij om het principe gaat en niet over de exacte uitwerking.
Mijn ook zeker, maar je bent natuurlijk wel gebonden aan wat de taal kan, je moet er dus wel altijd rekening mee houden iig.
Het volgende snap ik dus echt niet:

PHP:
1
2
3
4
5
6
7
8
9
10
  class myclass
     { var $MyArray;
         
        function setMyArray ($req_MyArray)  { $this->MyArray = $req_MyArray;}
        function testarray() { return is_array ($this ->MyArray) }
     }
[..]
  var $arr = new(myclass);
  $arr -> setMyArray(array('hello','world'));
  echo $arr->testarray();


bovenstaande voorbeeldje print 'false'. Ik stop dus heel duidelijk een array in $this->MyArray, maar een is_array ($this->MyArray) claimed toch dat het geen array is..

?!
PHP:
1
var $arr = new(myclass);

moet dit zijn:
PHP:
1
var $arr = new myclass();

en volgens mij is mag je geen spaties tussen $arr en -> en de method oid hebben. (denk ik hoor)

Verder is het ook wel fijn om dit even boven in je code te zetten:
PHP:
1
error_reporting(E_ALL);

dan zie je veel meer.

[ Voor 9% gewijzigd door Michali op 13-02-2005 14:30 ]

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik had idd. de foutjes er zelf ook al even uitgehaald.. die spaties mogen overigens wel, althans het werkt prima met.

Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
Verwijderd schreef op zondag 13 februari 2005 @ 14:30:
Ik had idd. de foutjes er zelf ook al even uitgehaald.. die spaties mogen overigens wel, althans het werkt prima met.
en als je error_reporting boven de code zet? wat zie je dan? volgens mij ben je na is_array ook een puntkomma vergeten.

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Michali schreef op zondag 13 februari 2005 @ 14:32:
en als je error_reporting boven de code zet? wat zie je dan? volgens mij ben je na is_array ook een puntkomma vergeten.
Het stukje wat ik hier postte, was louter voorbeeldcode om het principe van mijn vraag duidelijk te maken. Ik heb dat net even ingevoerd, en dan werkt het wel naar behoren, oftewel hij returned '1' (=true).

Blijkbaar heb ik in mijn oorspronkelijke code nog ergens een bug zitten. error_reporting had ik er al instaan, ik heb alle tips uit de FAQ ter harte genomen voordat ik uberhaupt aan PHP begon ;)

Hoe dan ook, mijn oorspronkelijke vraag is eigenlijk al door je beantwoordt.. PHP dereferenced niet en dat was de kern van mijn vraag, kom ik bij nalezing achter.

Thx. for the help iig :)
Pagina: 1