Question

Mon scénario particulier implique une transformation de texte en utilisant des expressions régulières dans une méthode privée. La méthode privée appelle preg_replace_callback, mais il semble que les rappels doivent être publics sur les objets. Je suis donc coincé pour sortir du monde privé et exposer les détails de la mise en œuvre lorsque je préfère ne pas.

Donc, en un mot: Puis-je utiliser une méthode d'instance comme rappel sans perdre l'encapsulation?

Merci.

Était-ce utile?

La solution

Oui, il semble que vous puissiez:

<?php

//this works
class a {
   private function replaceCallback($m) { return 'replaced'; }

   public function test() {
        $str = " test test ";
        $result = preg_replace_callback('/test/', array($this, 'replaceCallback'), $str);
        echo $result;
   } 
}

$a = new a();
$a->test();


//this doesn't work
$result = preg_replace_callback('/test/', array(new a(), 'replaceCallback'), ' test test ');    
echo $result;

Il semble donc que preg_replace_callback () , ou le mécanisme de rappel de PHP, est conscient de la portée dans laquelle il a été appelé.

Testé le 5.2.8

Autres conseils

Pouvez-vous créer une classe d'assistance distincte pour le traitement de texte et créer la méthode de rappel au sein de cette classe (elle peut être publique là-bas)? Vous pouvez transmettre une référence à la classe d'origine (objet) si vous avez besoin d'accéder à des données d'instance spécifiques.

L'interface publique de votre classe principale reste cohérente et propre, et vous extrayez un traitement de chaîne spécifique d'une classe à laquelle elle n'appartient probablement pas de toute façon ...

Ne pouvez-vous pas utiliser protégé? Il faudrait que je connaisse plus clairement la relation entre ces deux classes, mais vous devriez pouvoir l'étendre et utiliser les nouvelles méthodes protégées dont vous avez hérité sans les rendre publiques.

J'espère que ça aide!

A bientôt

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top