[PHP] vastleggen return value in interface

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • vorlox
  • Registratie: Juni 2001
  • Laatst online: 02-02-2022

vorlox

I cna ytpe 300 wrods pre miute

Topicstarter
Beste,

Ik heb een vraagje over PHP interfaces waarbij ik er niet uit kom via de PHP website / google.

Voorbeeldje.
In CS geef je in een interface zoiets als het volgt
code:
1
    bool GetCustomer(int customerID);


Hiermee geef je dus niet alleen aan dat die method ondersteund moet worden, en dat er een customerID naar toe moet maar ook dat die customerID een int moet zijn en dat de return value van die Method een boolean moet zijn.

In PHP kom ik niet verder dan
code:
1
function GetCustomer($customerID);


Nu vangt deze interface dus wel af dat er een customerID naar toe moet maar hij vangt niet af of er iets gereturned moet worden ofdat customerID van het type integer is.

Nu dus mijn vraag:
Kan ik in PHP toch afdwingen dat iemand niet alleen de interface implementeerd maar dat de functies ook de juiste return geven.

Ik heb zitten spelen met Reflection, maar met ReflectionMethod mis ik nou net de functie ReturnType / Return Value ofzoiets, waar ik dan weer uit op zou kunnen maken of de Method goed geimplementeerd is.

Ik kan bijna niet geloven dat dit niet kan....maar het blijft PHP
8)7

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Ik ben niet erg bekend met PHP, maar een functie heeft sowieso toch geen return type (of überhaupt parameter types) in PHP?

[ Voor 35% gewijzigd door RobIII op 21-09-2007 16:43 ]

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!

  • RAJH
  • Registratie: Augustus 2001
  • Niet online
Je kan alleen aangeven of een var van een bepaalde class moet zijn bijvoorbeeld:

function GetCustomer(Customer $customer);

Maar controleren op integers en dergelijke zou je toch binnen de functie zelf moeten doen, bijvoorbeeld door middel van is_numeric()/is_int()

Acties:
  • 0 Henk 'm!

  • vorlox
  • Registratie: Juni 2001
  • Laatst online: 02-02-2022

vorlox

I cna ytpe 300 wrods pre miute

Topicstarter
Ik ben niet erg bekend met PHP, maar een functie heeft sowieso toch geen return type in PHP?
Nope niet dat ik weet, en dat is nu juist het probleem eigenlijk :(.
Als ik zelf een class schrijf dan kan ik het idd binnen de method afvangen. Echter ik wil eigenlijk een controle uitvoeren op classes geschreven door derden. Deze moeten voldoen aan een interface echter ik vind deze mogelijkheden binnen PHP niet ver genoeg gaan. Dus wilde ik zelf met reflection de methods valideren op juistheid. Echter daar zit precies het probleem, als ik zou willen eisen dat een Method een boolean terug geeft en deze geeft een string terug dan zou ik dat graag willen valideren..
Maar ik vraag me sterk af of dit uberhaupt kan ik PHP waarbij elke variable op elke regel kan veranderen van int naar string naar array en terug...(Vroeger vond ik dit zo vettt...hehehe ;))
Ik ben bang dat je de verkeerde taal voor je toepassing hebt gekozen
Uhh, ja en nee, php is in principe lekker toegangkelijk (dus derden kunnen makkelijk classes bouwen), echter heeft idd ook zo zijn nadelen zoals dit voorbeeld.
Mwja ik was aan het proberen er dus een beetje om heen te werken.. ik stop bij deze met mijn zoekactie....ik ga een nieuwe PHP programmeren :9

[ Voor 18% gewijzigd door vorlox op 21-09-2007 17:11 ]


Acties:
  • 0 Henk 'm!

  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

PHP heeft zeker sinds PHP5 wat OO kenmerken zoals inderdaad interfaces en modifiers (public, protected , etc). Maar in PHP5 worden OO classes nog steeds geemuleerd. Vanaf PHP6 (discussie is nog steeds gaande) zou het wel mogelijk zijn om typed variables (en daarmee return values) te gebruiken. Echter momenteel is PHP nog steeds loose (aka weakly) typed.

Wat veel PHP programmeurs vaak vergeten is dat, hoewel PHP tegenwoordig ontzettend veel kan, het vooral bedoeld was (is) als een simpele, maar snelle scripting language. Wil je echte OO functionaliteit? Dan zul je moeten uitwijken naar andere talen zoals Ruby, Java of C#. Je zou ook een apache (apr) module kunnen schrijven in C(++). Dergelijke talen zijn strong typed.

Ik ben bang dat je de verkeerde taal voor je toepassing hebt gekozen.

If it isn't broken, fix it until it is..


Acties:
  • 0 Henk 'm!

  • mr_obb
  • Registratie: Juni 2001
  • Laatst online: 01-09 14:15

mr_obb

Lakse Perfectionist

On topic: Nee, dat kan niet zo maar met PHP, helaas.

Off-topic:
Niemand_Anders schreef op vrijdag 21 september 2007 @ 16:56:
Vanaf PHP6 (discussie is nog steeds gaande) zou het wel mogelijk zijn om typed variables (en daarmee return values) te gebruiken.
Kan je een bron aangeven? Dit is namelijk iets waar ik al heel lang op zit te hopen, maar ik heb nog nooit een bevestiging kunnen vinden.

Acties:
  • 0 Henk 'm!

  • prototype
  • Registratie: Juni 2001
  • Niet online

prototype

Cheer Bear

Return-type hinting is pas mogelijk w.s. vanaf PHP6.

  • Stephan224
  • Registratie: Maart 2002
  • Laatst online: 31-10-2022
Deze code krijg ik ook totaal niet werkend in PHP5 wat jij schrijft:

code:
1
2
3
4
5
6
7
function test();

function test() {
   return "A";
}

echo test();


Erg jammer, maar goed er is volgens mij ook geen oplossing of work around voor wat jij schrijft over return variable declaratie.

Trouwens vorlox, ik begrijp dat je de boel wel deels werkend krijgt met een interface op die van derden. Dan moet dit dus mogelijk zijn als ik je goed begrijp. (of iets in deze geest)

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class x { // Interface declaratie
   function test();
   // implementeer op een of andere manier de x1 of x2 classe hierzo in extends
   // van de x classe.
}

class x1 {
   function test() { return "A"; )
}

class x2 {
   function test() { return "B"; }
}

// Demo van gebuik
$testmanager = new x();
echo x->test()."<br>";


Ik ben dus zeer benieuwd hoe je dit doet. Als je een voorbeeld zou kunnen geven dan maak je me heel erg blij. (of iemand anders mag natuurlijk ook) ;)

[ Voor 46% gewijzigd door Stephan224 op 22-09-2007 01:11 ]

Software Developer, checkout my bitcoin software at my website www.haasonline.com (Trade Bots and more...)


  • CHeff
  • Registratie: Oktober 2002
  • Laatst online: 19-09 23:37

CHeff

Allemaal gekkigheid

Interfaces in PHP? Meer info hier: http://www.php.net/manual/en/language.oop5.interfaces.php

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
27
28
<?php
//interface declaratie
interface x { 
   public function test();
}

//interface implementatie
class x1 implements x{
   function test() { return "A"; }
}

//een 2de implementatie
class x2 implements x{
   function test() { return "B"; }
}

//op deze manier dan aanroepen
$testmanager = new x1();
echo $testmanager->test();

//of deze manier
$testmanager = new x2();
echo $testmanager->test();

//maar niet op deze manier
$testmanager = new x();
echo $testmanager->test();
?>

  • pderaaij
  • Registratie: Oktober 2005
  • Laatst online: 18-08 20:16
prototype schreef op vrijdag 21 september 2007 @ 17:20:
Return-type hinting is pas mogelijk w.s. vanaf PHP6.
Hinting??

Kortom... je kan nog steeds een ander return type krijgen?

  • TheDane
  • Registratie: Oktober 2000
  • Laatst online: 16:30

TheDane

1.618

pderaaij schreef op zaterdag 22 september 2007 @ 10:45:
[...]


Hinting??

Kortom... je kan nog steeds een ander return type krijgen?
De "hint" is bedoeld voor de programmeur zodat ie ziet welk object of array type php eist.
http://php.net/language.oop5.typehinting

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 15:14

Creepy

Tactical Espionage Splatterer

Maar in je voorbeeld geen enkele manier om een return type vast te leggen. Dus ook in PHP5 niet (goed) mogelijk om dat af te dwingen. En parameter type afdwingen werkt niet voor string en int's maar alleen voor classes en array's

[ Voor 12% gewijzigd door Creepy op 22-09-2007 12:17 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • Stephan224
  • Registratie: Maart 2002
  • Laatst online: 31-10-2022
Hardstikke bedankt CHeff !!!

[ Voor 100% gewijzigd door een moderator op 22-09-2007 13:55 ]

Software Developer, checkout my bitcoin software at my website www.haasonline.com (Trade Bots and more...)


  • CHeff
  • Registratie: Oktober 2002
  • Laatst online: 19-09 23:37

CHeff

Allemaal gekkigheid

Creepy schreef op zaterdag 22 september 2007 @ 12:16:
[...]

Maar in je voorbeeld geen enkele manier om een return type vast te leggen. Dus ook in PHP5 niet (goed) mogelijk om dat af te dwingen. En parameter type afdwingen werkt niet voor string en int's maar alleen voor classes en array's
Nee, dat is waar. Maar ik wilde alleen even duidelijk maken hoe je een interface maakt :9

Waar je misschien nog wel wat mee kunt doen is het goed documenteren van je interface. Wat voor parameters accepteert de functie en wat geeft hij terug. Verder valt er vrij weinig aan te doen.

  • prototype
  • Registratie: Juni 2001
  • Niet online

prototype

Cheer Bear

pderaaij schreef op zaterdag 22 september 2007 @ 10:45:
[...]


Hinting??

Kortom... je kan nog steeds een ander return type krijgen?
Bingo, en specifieker dus, als je een type x hint hoeft het niet te betekenen dat je een type y krijgt zodanig dat y co- danwel invariant is aan x.

  • MBV
  • Registratie: Februari 2002
  • Laatst online: 20-09 22:44

MBV

Waarom begin je niet met phpdoc? In verschillende IDE's werkt dat prima (Eclipse PDT bijv). Je krijgt direct bij de code-completion de types te zien, en hij gebruikt die hint ook voor code-completion. Als Klassenaam een bestaande klasse is, die PDT kent, dan zal hij bij $val2->[crtl+space] een lijst met members enzo geven.
PHP:
1
2
3
4
5
6
7
8
9
10
/**
 * deze functie doet iets leuks
 * @param $val1 int ik wil hier een geheel getal
 * @param $val2 Klassenaam ik wil hier een klasse om iets mee te doen
 * @return int dan geef ik weer een int terug
 */
function blaat($val1, $val2)
{
  return (int) $val2->member * $val1;
}

edit:
kennelijk is GoT geen IDE, javadoc wordt niet ondersteund ;)

[ Voor 28% gewijzigd door MBV op 22-09-2007 13:39 ]


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 15:14

Creepy

Tactical Espionage Splatterer

Tja.. aardig dat je een voorbeeld krijgt maar vragen om een werkend voorbeeld is en blijft gewoon een scriptrequest terwlijk de link die CHeff geeft met wat google werk ook wel zelf te vinden is.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • vorlox
  • Registratie: Juni 2001
  • Laatst online: 02-02-2022

vorlox

I cna ytpe 300 wrods pre miute

Topicstarter
wow wow ik had dit draadje even met rust gelaten want ik had het idd al opgegeven.
Hehe ik had het stuk van prototype even gelezen en php zegt it's not the PHP way..

Ik ben nu misschien echt afgedwaald, maar wat is nu eigenlijk het voordeel van loosly typed.
Dat geeft toch meer kopzorgen dan dat het oplost.. of wordt ik nu gek

Sorry nog even ontopic.

Ik vang het nu maar af in mijn eigen programma, dus ik check hard via
is_numeric, is_null, is_array enz af of de method wel iets bruikbaars returned anders throw ik een exception.
Is wel een boel rommelcode vind ik

Echter ik blijf vinden dat PHP dit via interface defenitie had moeten kunnen afvangen. (Maar dat is dus wachten op PHP 6) en dan blijft het hinting...dus ook niet perfect.

Ik heb nog wel even zitten kijken naar unit testen.
Hiermee kun je bepaalde verwachtingen uitspreken over een class / functie / argument
en in een test mokup (kweet niet of ik dat goed schrijf) kun je deze verwachtingen testen.
Dit zou wel betekenen dat elke class van derden eerst door een unit test heen moet alvorens deze mag worden toegevoegd aan de uit te voeren clasess.

Mwa ik kom er wel. :*)

[ Voor 55% gewijzigd door vorlox op 22-09-2007 14:48 ]


  • Stephan224
  • Registratie: Maart 2002
  • Laatst online: 31-10-2022
offtopic:
[quote]Creepy schreef op zaterdag 22 september 2007 @ 13:56:
[...]

Tja.. aardig dat je een voorbeeld krijgt maar vragen om een werkend voorbeeld is en blijft gewoon een scriptrequest terwlijk de link die CHeff geeft met wat google werk ook wel zelf te vinden is.
[/quote]

Mod je hebt gelijk. Het probleem is alleen dat als je zoekt op interfaces voor php dan krijg je totaal geen goede info, probeer zelf maar eens. Vandaar dat ik het eventjes zo probeerde. Trouwens ik vroeg om een concept voorbeeld, dat hoeft niet werkend te zijn. De link was ook al voldoende voor me geweest, maar CHeff was zo vriendelijk om een voorbeeld te schijven. En idd, script requests mogen hier niet. Dat was ik wel eventjes vergeten om eerlijk te zijn.

Anyway, als je het nodig vind om er verder over te praten dan graag per pm, anders gaat dit helemaal offtopic.

Software Developer, checkout my bitcoin software at my website www.haasonline.com (Trade Bots and more...)


  • prototype
  • Registratie: Juni 2001
  • Niet online

prototype

Cheer Bear

vorlox schreef op zaterdag 22 september 2007 @ 14:37:
Ik ben nu misschien echt afgedwaald, maar wat is nu eigenlijk het voordeel van loosly typed.
Dat geeft toch meer kopzorgen dan dat het oplost.. of wordt ik nu gek
Dat ligt over 't algemeen in de aard van dynamische talen, en in zulke gevallen zeg ik right tool for the right job.
Sorry nog even ontopic.

Ik vang het nu maar af in mijn eigen programma, dus ik check hard via
is_numeric, is_null, is_array enz af of de method wel iets bruikbaars returned anders throw ik een exception.
Is wel een boel rommelcode vind ik
Dat is het ook eigenlijk, het concept van seperation of concerns dien je als software engineer goed in de vingers te hebben. Design by contract zou hier uitkomst bieden denk ik door in de specificatie op te nemen wat iets moet zijn alvorens je het mag aanroepen en zekere resultaten ervan mag verwachten.
Echter ik blijf vinden dat PHP dit via interface defenitie had moeten kunnen afvangen. (Maar dat is dus wachten op PHP 6) en dan blijft het hinting...dus ook niet perfect.
Je blijft werken met een dynamische taal en de discussie van perfect zijn ja of nee is ook niet helemaal aan de orde dan. Er is een reden waarom dynamische en statische talen bestaan: keuze is aan jou om welke te gebruiken en dat doe je na de pro's en cons af te wegen. ;)
Ik heb nog wel even zitten kijken naar unit testen.
Hiermee kun je bepaalde verwachtingen uitspreken over een class / functie / argument
en in een test mokup (kweet niet of ik dat goed schrijf) kun je deze verwachtingen testen.
Dit zou wel betekenen dat elke class van derden eerst door een unit test heen moet alvorens deze mag worden toegevoegd aan de uit te voeren clasess.

Mwa ik kom er wel. :*)
Als je dat als voorwaarde stelt wel. Maar ik weet niet of het zo handig is om dit te testen in een unittest. Zelf denk ik als iemand een verkeerde type waarde invoert in een functie terwijl in de specificatie gezegd is dat het argument van een bepaalde type moet zijn, dat je dan hard mag falen: if code fails, it should fail hard.

  • Enfer
  • Registratie: Februari 2004
  • Laatst online: 18-09 16:32
Je zou dingen kunnen proberen zoals instanceof..
http://www.php.net/manual/en/language.operators.type.php

En dan NULL of iets dergelijks returnen als het type niet voldoet.. Echt keiharde return-values krijg je (nog) niet in php gebakken.. Daarvoor is het idd te weak-typed ;)

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
27
28
29
30
31
32
33
34
<pre>
<?php

class A {
    function foo(){
        return "bar";
    }
    
}

class B {
    function foo(){
        return "bar";
    }
    
}
$a = new A();
$b = new B();

if( $a instanceof $b ){
    echo "ja";
} else {
    echo "nee";
}
echo "<br>";
$c = new A();
if( $a instanceof $c ){
    echo "ja";
} else {
    echo "nee";
}

?>
</pre>


Dit zal dus eerst nee, en daarna ja opleveren.

[ Voor 87% gewijzigd door Enfer op 22-09-2007 16:09 ]


  • BikkelZ
  • Registratie: Januari 2000
  • Laatst online: 21-02 08:50

BikkelZ

CMD+Z

Je zou natuurlijk net als in Java je primitieven ook een echte klasse kunnen geven, compleet met functies om allerleid dingen te doen en te checken die je niet met een simpele primitieve kan. Bijvoorbeeld:

http://java.sun.com/j2se/...pi/java/lang/Integer.html

En kijk dan eens naar de tweede constructor met String. Gewoon netjes een foutmelding als hij niet convert naar een echte Integer, dwing je weer try/catch mee af, afijn.

iOS developer

Pagina: 1