Avatar billede hermandsen Juniormester
10. august 2009 - 22:21 Der er 11 kommentarer og
1 løsning

Type hinting på metode som bruger func_get_args

Hej Eksperter

Jeg har en statisk klasse som tager X antal parametre af en anden abstrakt klasse.

Eksempel:

<?php
abstract class Foo {
  public abstract function __toString();
}
class Bar extends Foo {
  public function __toString() {
    return 'Ost';
  }
}
class Pony extends Foo {
  public function __toString() {
    return 'Test';
  }
}
class Hest {
  public static function run(Foo $args) {
    $a = func_get_args();
    foreach ($a as $c)
      echo $c;
  }
}
Hest::run(new Bar(), new Pony(), new Hest());
?>

Kan jeg sikre mig at alle parameterne som sendes til Hest::run() er af typen Foo udelukkende vha. type hinting, frem for at skulle løbe mit array i gennem manuelt og tjekke typen på hver eneste objekt?

Bonus spørgsmål:
Kan det samme ovenstående eksempel udtrykkes med PHPDoc og i så fald hvordan?

// hermandsen
Avatar billede repox Seniormester
10. august 2009 - 23:05 #1
Jeg synes det var et interessant spørgsmål, særligt fordi at type hinting jo er en kærkommen ting til PHP, men der er ikke noget der tyder på det er muligt.
Du bliver desværre nok nød til at løbe dit array igennem og sammenligne.
Avatar billede hermandsen Juniormester
10. august 2009 - 23:18 #2
Hmmm... Ikke ligefrem det svar jeg havde håbet på. :(

Hvad med php's interne funktioner f.eks. array_merge: http://dk2.php.net/array_merge

Der er N argumenter - alle af typen array.
Avatar billede repox Seniormester
10. august 2009 - 23:24 #3
Her er spørgsmålet om de ikke rent faktisk, via runtime, kontroller hver enkelte argument for om det er array. Somme tider er KISS princippet også det mest effektive.
Avatar billede hermandsen Juniormester
10. august 2009 - 23:32 #4
Good point...

Så må alternativet blive en manuel throw InvalidArgumentException i stedet.

Hvad med PHPDoc, nogle gode idéer?
Avatar billede repox Seniormester
10. august 2009 - 23:41 #5
Desværre ikke; jeg er ikke den store fan PHPDoc.
Avatar billede martin1000ben Nybegynder
11. august 2009 - 10:49 #6
Nok ikke direkte i metode argument listen, men du kan jo putte det ind i løkken

public static function run($args) {
    $a = func_get_args();
    foreach ($a as $c)
      if (! ($c instanceof Foo)) {
        // Seems NOT ok
      } else {
        // Seems OK
      }
    }
}
Avatar billede 88mouv-net Nybegynder
11. august 2009 - 15:25 #7
Lige for et en god ordens skyld, så findes der ikke statiske klasser :P
Avatar billede hermandsen Juniormester
11. august 2009 - 15:35 #8
> 88mouv-net
Potato, potato...
Avatar billede 88mouv-net Nybegynder
12. august 2009 - 13:56 #9
det var skam bare noget information, så folk ikke bliver misinformeret.
Avatar billede hermandsen Juniormester
19. august 2009 - 19:20 #10
Det lader til at man kan dokumenter sine metoder ved at skrive "$parameternavn,..." i phpdocs @param.

Eksempel:
<?php

class Hest {
/**
* @param Foo $args,... Rigtig mange gang mange elementer
*/
  public static function run(Foo $args) {
    $a = func_get_args();
    foreach ($a as $c)
      echo $c;
  }
}
Hest::run(new Bar(), new Pony(), new Hest());

?>

Se evt. fancy_debug funktionen på http://manual.phpdoc.org/HTMLSmartyConverter/HandS/phpDocumentor/tutorial_tags.param.pkg.html

// hermandsen
Avatar billede martin1000ben Nybegynder
19. august 2009 - 19:29 #11
Men stadig er det kun dokumentation, så det er ikke noget PHP-parseren melder som fejl, hvis du smider andet ind.


<?php

class Baz
{
/**
* @param Foo $args,...
*/
  public static function run(Foo $args) {
  }
}

Baz::run(new Foo(), new Untitled());
// Virker fint
?>
Avatar billede hermandsen Juniormester
20. august 2009 - 19:31 #12
Desværre nej, men det giver hjælp til code-completion. :)

Lukker...
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester