Dzień dobry.
Przejdę do kodu, bo co tam będę dziabolił...
public function getAmountUnits($nameArmy)
{
foreach ($this->units[0][$nameArmy] as $index => $unitObject) {
return $unitObject->getAmount();
}
}
Jeżeli macie jakąś koncepcję nad jego(Lub całości) ulepszeniem, to nie krępować się. :D
Co niektórzy już dostrzegają błąd:
Return w foreach.
Jak poradzić sobie z tym stanem rzeczy?
Dostaję tylko pierwszy wynik, niezbyt fajnie.
Niby mogę zrobić to na print, acz...
Proces wywołania tej metody przebiega w taki sposób:
$army = new \WarCraft\Units\MakeUnits(new \WarCraft\Units\Units([
'Army' => [
new \WarCraft\Units\Unit\Ghost(3),
new \WarCraft\Units\Unit\Orc(2)
]
]));
print $army->getAmountUnits('Army')."\n";
Klasa MakeUnits
/*Namespace*/
class MakeUnits
{
/*...*/
public function getAmountUnits($nameArmy)
{
return $this->units->getAmountUnits($nameArmy);
}
/*...*/
}
Klasa Units
/*Namespace*/
class Units
{
/*...*/
public function getAmountUnits($nameArmy)
{
foreach ($this->units[0][$nameArmy] as $index => $unitObject) {
return $unitObject->getAmount();
}
}
/*...*/
}
Klasa Abstrakcyjna AbstractUnit (I ostatnia!)
/*Namespace*/
abstract class AbstractUnit implements InterfaceUnit
{
protected $amount;
public function __construct($amount)
{
$this->amount = $amount;
}
public function getAmount()
{
return $this->amount;
}
}
Więc IDE podświetla mi:
/*getAmountUnits*/
return $this->units->getAmountUnits($nameArmy);
Jakobym zwracał void'a. :/
Muszę pogodzić się z tym jakże pięknym żółtym tłem czy da się jakoś ustalić więcej return w pętli?
Google'owałem:
http://stackoverflow.com/questions/3451906/multiple-returns-from-function
Ale array to ja nie chcę zwracać.
Panowie, bo Wy, jak na moje rozumowanie, zaczęliście rozwiązywać problem wywoływania „nieistniejącej” metody.
$unitObject->getAmount();
//Method 'getAmount' not found in subject class.
Tak w sumie to foreach z return już działa. Usunąłem return z:
public function getAmountUnits($nameArmy)
{
/*tutaj był return*/ $this->units->getAmountUnits($nameArmy);
}
I nie ma również komunikatu o voidzie.
Więc, wolę się upewnić, wasze rady dotyczą wywołania metody w sposób normalny, aby IDE nie zaznaczał jako nieznalezioną, czy z return?
Jeżeli tego drugiego, to nie narzekam - Bo wywoływanie tego w sposób jaki to robię niezbyt mnie satysfakcjonuje.
(Odpowiedź to: Nadal foreach() / Chodzi o wywoływanie nieistniejącej metody.)
Problem rozwiązany za pomocą wzorca: Composite.
Jestem bardzo - bardzo bardzo - początkującym we wzorcach, także nie powiedziałbym aby był to najlepszy wybór.
Obecnie poszukuję lepszego rozwiązania(Wzorca). :)
Kod:
[...Namespace...]
class Army extends CompositeUnit
{
[...]
public function amount() : int
{
$amountUnits = 0;
foreach ($this->units as $unit) {
$amountUnits += $unit->amount();
}
return $amountUnits;
}
[...]
}
Podobne do tego, co zaproponował Efik. Acz, na wzorzec DI jeszcze przyjdzie czas. :D
Więcej kodu, tutaj:
https://github.com/HaKIMus/oopfun/tree/feature
Dodatkowy okrojony ze wszystkiego i ułomny UML:
Miłego dnia, bądź nocy, a je lecę dalej czytać artykuły, aby skorzystać z lepszego rozwiązania.