2010-09-28 7 views
11

J'ai un code PHP 5.3 qui construit un tableau à passer à une vue. C'est le code que j'ai.conversion de code avec des fonctions anonymes à PHP 5.2

# Select all this users links. 
$data = $this->link_model->select_user_id($this->user->id); 
if (count($data) > 0) { 
    # Process the data into the table format. 
    $table = array 
    (
     'properties' => array 
     (
      'delete_link_column' => 0, 
     ), 
     'callbacks' => array 
     (
      # Callback for the name link. 
      function($value) { 
       return sprintf('<a href="/links/view/name/%s">%s</a>', $value, $value); 
      }, 
      # Callback for the category link. 
      function($value) { 
       return sprintf('<a href="/category/view/name/%s">%s</a>', $value, $value); 
      }, 
      # Callback for the creation date. 
      function($value) { 
       return date('jS M Y', $value); 
      }, 
      # Callback for the delete link. 
      function($value) { 
       return sprintf('<a href="links/delete/name/%s">delete</a>', $value); 
      }, 
     ), 
     'columns' => array 
     (
      'name', 'category', 'creation date', 
     ), 
     'data' => array 
     (

     ), 
     'sorting' => array 
     (
      'sort' => false, 
     ), 
    ); 

Cependant, le problème est que je ne peux pas utiliser les fonctions anonymes en PHP 5.2, ce qui est le serveur que je dois télécharger ce travail scolaire. La vue requiert des fonctions de rappel à définir pour pouvoir les appeler.

Quelle serait la plus élégante façon de convertir ce code PHP à ne pas utiliser les fonctions anonymes? Merci.

+1

Quand et comment et pourquoi appelle-t-on ces rappels? – deceze

+0

@deceze Ce tableau est transmis à une vue qui traite le tableau et crée une table à partir des données. Les rappels sont appelés pour les données dans chaque colonne pour formater les données. Donc si une valeur de cellule de table était 'Boats' dans la première colonne, la vue traiterait la valeur 'Boats Je ne voulais pas vraiment changer la vue parce que j'ai beaucoup de contrôleurs qui l'utilisent comme ça. – NeedsEducation

Répondre

8

Vous pouvez appeler un de ces fonctions comme ceci:

$func = $callbacks[0]; 
$func(); 

Ce qui fonctionne également avec create_function() et en utilisant des chaînes pour les fonctions nommées comme ceci:

function test() { 
    echo "test"; 
} 
$func = 'test'; 
$func(); 

$func = create_function('' , 'echo "test 2"; '); 
$func(); 

De plus, si l'appel est fait à l'aide call_user_func vous pouvez utiliser array($object, 'func_name') pour appeler une méthode publique sur un objet ou d'une classe avec array('Class_Name', 'func_name'):

class Test { 
    public static function staticTest() { echo "Static Test"; } 
    public function methodTest() { echo "Test"; } 

    public function runTests() { 
    $test = array('Test', 'staticTest'); 
    call_user_func($test); 

    $test = array($this, 'methodTest'); 
    call_user_func($test); 
    } 
} 

$test = new Test(); 
$test->runTests(); 
+0

Merci juste ce dont j'avais besoin. – NeedsEducation

7

Les fonctions anonymes sont idéales pour un compromis éphémère, comme les écouteurs d'événement dans les modèles comme observateur. Toutefois, comme vous avez déjà formalisé une interface (rappels pour le rendu des noms, des catégories, des dates de création et d'un lien de suppression), vous pouvez également définir une interface de 'rendu' qui nécessite ces 4 méthodes. à mettre en œuvre. Au lieu de passer des rappels, vous passeriez une sous-classe de rendu unique à la vue, qui pourrait ensuite être utilisée pour appeler les méthodes appropriées. La vue pourrait également le valider en vérifiant la classe parente. Cela vous permettrait toujours d'échanger des rendus dans l'esprit de la POO portable et réutilisable sans nécessiter de fonctions anonymes.

Y at-il une situation où votre callbacks serait jamais venir de code arbitraire (par exemple plugins)? Sinon, il n'y a vraiment aucun avantage à rendre ces rappels anonymes. Il peut sembler que vous économisez un peu de ballonnement d'espace de noms, mais vous le rendez également plus difficile à déboguer ou à documenter.

+3

+1 pour suggérer une méthode OOP plus propre ... Pourrait peut-être utiliser un exemple source? – gnarf

+0

Je Jeff, merci pour la réponse, ce que vous dites fait beaucoup de sens. Désolé je n'ai pas marqué votre réponse comme correcte, les deux réponses que j'ai reçues sont correctes (et la prochaine fois je le ferais de la façon dont vous parlez). – NeedsEducation

+0

Pas de problème! Je suis content que nous puissions tous les deux aider. :) –

Questions connexes