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.
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.
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.
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.
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.
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.
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?