webForumDet fria alternativet

Workaround, multipla konstruktorer?

PHP

5 svar · 464 visningar · startad av Compusa

Medlem sedan jan. 20023 327 inlägg
Frågan#1

PHP har ju inte stöd för multipla konstruktorer, finns det något "best-practice" för att skapa något liknande detta?

Medlem sedan feb. 2007278 inlägg
#2

Compusa skrev:

PHP har ju inte stöd för multipla konstruktorer, finns det något "best-practice" för att skapa något liknande detta?

Jag förutsätter att du vill ha något i stil med följande: http://sip.clarku.edu/tutorials/java/java.html#multiple

Jag har aldrig sett någon diskussion om detta i någon av de böcker jag läst, eller på någon ledande PHP-utvecklares hemsida. Denna fråga skulle jag nog ställa på SitePoints PHP Application Design forum.

Denna tråd verkar diskutera din fråga: http://www.sitepoint.com/forums/showthread.php?t=368645

Om jag får ge mig till en gissning på hur det kan lösas - då jag själv aldrig varit i situationen - så skulle jag nog titta på func_num_args, func_get_arg och func_get_args. Alternativt skulle jag låta argumentet till konstruktorn vara ett objekt och sedan köra metoder från det i konstruktorn.

http://www.sitepoint.com/forums/showthread.php?t=476361

Initiala default-värden på parametrar kan också vara en del av lösningen.

Medlem sedan dec. 19996 721 inlägg
#3

En vanlig variant inom C# (som i och för sig har konstruktoröverladdning) är att man skapar statiska factorymetoder på klassen som sköter hela biffen.

$myclass = ClassName.CreateClass(ett gäng argument);
$myotherclass = ClassName.CreateClassInAnotherWay(ett gäng argument);

Kan inte fatta varför överladdning är så uppf*ckat i PHP. Det som kallas overloading i PHP-manualen påminner inte om vanlig overloading (inte för metoder i alla fall), utan är snarare call interception och AOP.

Medlem sedan jan. 20023 327 inlägg
#4

itpastorn skrev:

Jag förutsätter att du vill ha något i stil med följande: http://sip.clarku.edu/tutorials/java/java.html#multiple

Jag har aldrig sett någon diskussion om detta i någon av de böcker jag läst, eller på någon ledande PHP-utvecklares hemsida. Denna fråga skulle jag nog ställa på SitePoints PHP Application Design forum.

Denna tråd verkar diskutera din fråga: http://www.sitepoint.com/forums/showthread.php?t=368645

Om jag får ge mig till en gissning på hur det kan lösas - då jag själv aldrig varit i situationen - så skulle jag nog titta på func_num_args, func_get_arg och func_get_args. Alternativt skulle jag låta argumentet till konstruktorn vara ett objekt och sedan köra metoder från det i konstruktorn.

http://www.sitepoint.com/forums/showthread.php?t=476361

Initiala default-värden på parametrar kan också vara en del av lösningen.

Har kollat litegran på det där, känns tyvärr lite för omständigt men tack för lästipsen, kanske kan jag komma fram till något med hjälp av detta.

emission skrev:

En vanlig variant inom C# (som i och för sig har konstruktoröverladdning) är att man skapar statiska factorymetoder på klassen som sköter hela biffen.

$myclass = ClassName.CreateClass(ett gäng argument);
$myotherclass = ClassName.CreateClassInAnotherWay(ett gäng argument);

Jo, så skulle man ju kunna göra men då anser jag att man bör göra konstruktorn privat, har inte hunnit testa hur det fungerar med PHP, får ta och göra det.

emission skrev:

Kan inte fatta varför överladdning är så uppf*ckat i PHP. Det som kallas overloading i PHP-manualen påminner inte om vanlig overloading (inte för metoder i alla fall), utan är snarare call interception och AOP.

Instämmer, det hela bottnar väl i att PHP i grunden är dynamiskt typat.

Medlem sedan juni 20008 205 inlägg
#5

emission skrev:

Kan inte fatta varför överladdning är så uppf*ckat i PHP.

Det är väl inte så himla konstigt i ett språk som tillåter defaultvärden på argument. Annars vore det ju knepigt att skilja på de här funktionerna:

function f($arg){...}
function f($arg1, $arg2 = ''){...}

... vilket iofs går att komma runt, men någonstans får man väl dra gränsen.

Medlem sedan jan. 20023 327 inlägg
#6

Jag hade en tanke att göra wrappers för alla primitiva typer och således kunna överladda genom att använda objekt för type-hinting, men det fungerar inte det heller.

Gjorde en snabb implementering enligt Emissions beskrivning och det fungerar naturligtvis, men särskilt smidigt? Njaee, bara en sån sak som att komma på vettiga namn på funktionerna ;) init, initBrand, initBrandModel?

<?php

class Car {
    
    private $brand;
    
    private $model;
    
    private function __construct($brand, $model) {
        $this->brand = $brand;
        $this->model = $model;
    }   

    public static function init() {
        return new Car('', '');
    }
    
    public static function initBrand($brand) {
        return new Car($brand, '');
    }
    
    public static function initBrandModel($brand, $model) {
        return new Car($brand, $model);
    }
    
    public function printInfo() {
        echo "$this->brand $this->model<br />";
    }
    
}

$firstCar = Car::initBrand('Volvo');
$firstCar->printInfo();
$secondCar = Car::initBrandModel('Volvo', 'S80');
$secondCar->printInfo();

?>

Lekte runt lite till och koden nedan gör ju det jag vill om än inte på samma sätt som exempelvis i Java och C# där det finns stöd för överladdning. Nackdelen med denna lösning är ju att den inte är lika tydligt fast om man kör med typ hinting blir det nog ännu bättre :)

<?php

class Car {
    
    private $brand;
    
    private $model;
    
    /**
     * Enter description here...
     *
     * @param <req> string $brand
     * @param <opt> string $model
     */
    public function __construct($brand, $model = '') {
        $this->brand = $brand;
        $this->model = $model;
    }   
    
    public function printInfo() {
        echo "$this->brand $this->model<br />";
    }    
}

$firstCar = new Car('Volvo');
$firstCar->printInfo();

$secondCar = new Car('Saab', '9000');
$secondCar->printInfo();

?>

En lite fråga, när man initierar ett default-värde bör man då använda '' eller null som parameter-värde?

/red
Hittade en lösning som påminner om det itpastorn pratade om, tyvärr tycker jag inte det var så snyggt: http://www.webscriptexpert.com/Php/Constructor overloading Java and PHP5/

259 ms totalt · 4 externa anrop · v20260731065814-full.e96017d9
120 ms — deklarationer (db)
0 ms — hämta statistik (cache)
131 ms — hämta tråd, inlägg och bilagor (db)
124 ms — ändringar (db)