2 Stimmen

Halten Sie foreach((array)$foo as $bar) für einen Codegeruch?

Halten Sie dies für einen Codegeruch?

foreach((array)$foo as $bar)
{
    $bar->doStuff();
}

Sollte ich das stattdessen verwenden?

if (isset($foo) && is_array($foo))
{
    foreach($foo as $bar)
    {
        $bar->doStuff();
    }
}

Jede andere gute Praktiken zu decken, nicht setzen Variablen und behaupten, ein Array?

1voto

Ich tue dies in der Regel, um sicherzustellen, dass ein foreach sowohl Skalare als auch Auflistungen verarbeiten kann:

<?php

foreach (makeSureTraversable($scalarOrCollection) as $val)
{
    // Do something.
}

function
makeSureTraversable($anything)
{
    if (is_array($anything) || ($anything instanceof Traversable))
    {
        return $anything;
    }
    else
    {
        return array($anything);
    }
}

Auf diese Weise behandle ich auch Klassen, die Traversable (aus der SPL) implementieren, was bedeutet, dass sie in Foreaches verwendet werden können.

0voto

Martins Punkte 11
if (!isset($foo) && !is_array($foo)) {
    throw new InvalidArgumentException('Wrong array passed'); 
    // Or do something to recover lost array
}
foreach($foo as $bar) {
    $bar->doStuff();
}

0voto

nickf Punkte 517253

Es kommt häufig vor, dass man eine Funktion schreiben möchte, die einen oder mehrere Werte für einen Parameter annimmt:

function getNamesById($id) { }

In diesem Fall würde es Sinn machen, dass, wenn diese Funktion mit einem Array von ids aufgerufen wurde, sie wahrscheinlich ein Array von Namen zurückgeben sollte. Um dem aufrufenden Code zu ersparen, die Eingabe in ein Array zu packen und dann die Ausgabe zu entpacken, sollte ein Skalar zurückgegeben werden, wenn Sie nur einen Skalar übergeben. Betrachten Sie den wahrscheinlichen Inhalt einer Funktion, die sowohl skalare als auch Array-Parameter verarbeiten kann:

function getNamesById($id) {
    $returnAnArray = is_array($id);
    $output = array();
    foreach ((array)$id as $theId) {
        // perform some logic
        $output[] = someFunction($theId);
    }
    return $returnAnArray ? $output : $output[0];
}

Sie können sehen, dass in diesem Fall, Casting auf ein Array definitiv macht die Dinge viel einfacher für alle. Wie man so schön sagt: Sei großzügig in dem, was du akzeptierst... Solange es dokumentiert ist, dass es sich um erwartet dass eine Variable beides sein kann, dann sehe ich kein Problem. PHP ist ein duck-typed Sprache, die sowohl Vor- als auch Nachteile hat, aber dies ist einer der Vorteile, also genießen Sie ihn!

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X