Alias für Funktion?

Tommy57

Erfahrenes Mitglied
Hallo,

bei meinem aktuellen Projekt habe ich folgendes Problem. Ich habe eine Translater-Klasse, mit der ich die Stings auf meiner Seite in verschiedene Sprachen übersetzen möchte. Mein Problem ist an der Stelle, dass ich immer die translate Funktion aufrufen muss, wenn ich das tun möchte und das sieht echt bescheuert aus und nervt.

$this->translater->translate('Welcome');

Gibt es eine Möglichkeit, die Funktion direkt per Kürzeln anzusprechen? Idealfall wäre, wenn es dann nur noch hieße:

translate('Welcome');

Gruß, Tommy
 
Wenn ich das lösen müsste, dann würde ich das so machen: Klasse "ML" (steht für Multilanguage) hat eine statische Funktion translate.

PHP:
class ML
{
  private static $lang = 'en';

  public static function setLanguage($lang)
  {
    self::$lang = $lang;

    // z.b. gettext verwenden
    bindtextdomain($lang, '/Verzeichnis/mit/den/mo/files');
  }

  public static function translate($str)
  {
    // Hier kommt der Code, der die Übersetzung in die jeweilige Sprache macht
    $trans = gettext($str);

    return $trans;
  }
}

Dann kann mna prima überall folgendes machen:


PHP:
class SomeClass
{
  public function someFunction($someParameter)
  {
     echo ML::translate('__WILLKOMMEN__');
  }
}
 
Zuletzt bearbeitet:
Hi Saftmeister,

ja über ne statische Funktion wäre ne Idee, wobei der Aufruf ML->translate('...'), auch recht kurz ist. Bei mir würde es ja wieder so aussehen:
Translater::translate('...').

Wenn PHP Mehrfachvererbung unterstüzen würde, würde ich mich ja für diese Variante entscheiden:

class Test extends Translater {
...
...
$this->translate('...');
}


Ich denke, es führt kein Weg an diesem Schönheitsfehler vorbei.

Danke und Gruß,
Tommy
 
Wofür brauchst du in diesem Falle Mehrfach-Vererbung? Du könntest von Translater eine abgeleitete Klasse ML erstellen, und in dieser die Methoden statisch machen, dazu noch ein Singleton und gut ist.
 
Hi,

also ich möchte einfach nur ne kürze und zugleich sinnvolle Schreibweise für den Funktionsaufruf haben.

Ich habe gerade eine Möglichkeit gefunden über Delegation, das heißt ich übergebe den Funktionsnamen in einem String als Parameter an die Klasse weiter. Diese kann dann ganz normal über die Variable auf die Funktion zu greifen. Sehr schick, aber dann müsste ich glaub ich die Translaterklasse umschreiben in normale Funktionen. Muss ich mal drüber nachdenke. Aber ich denke, das wäre nen guter Ansatz.

Danke nochmal und Gruß,
Tommy
 
Und wo hast du dann Code gespart? Du musst dann halt eine Delegations-Funktion aufrufen und übergibst dann statt einem eben 2 Parameter. Ist nicht wirklich weniger code. Außerdem hast du dann Code-Verdoppelungen an allen Ecken und Enden. Aber es ist deine Entscheidung. Meine Variante ist hier etwas kürzer:

PHP:
class ML extends Translater
{
  private static $_instance;

  public static function translate($string)
  {
    if(!self::$_instance)
      self::$_instance = new Translator();

    return self::$_instance->translate($string);
  }
}

Ganz easy ;)

Natürlich kann man auch so was machen:

PHP:
$translator = new Translator();
function translate($string)
{
  return $translator->translate($string);
}

class SomeClass
{
  public function someFunktion($someParameter)
  {
    echo translate('__WILLKOMMEN__');
  }
}
 
Ja, das stimmt auch wieder. Also deine erste Variante gefällt mir auch besser, wobei ich meine Translater Klasse auch gleich ML nennen kann und nen Singleton habe ich auch schon drinnen.

Aber könnte ich vllt der Klasse die Parameter direkt übergeben?
So dass ich dann statt
$this->translater->translate(...);
einfach sagen könnte:
$this->translater(..);

Gruß, Tommy
 
Hast du für deine "Geschäftsklassen" eine allgemeine Klasse? Dann könntest du dort einfach eine Methode "translate" einbauen, die eine Instanz von Translater erzeugt und dort die Methode "translate" aufruft. In etwa so:

PHP:
class Allgemein
{
  protected function translate($string)
  {
    return Translater::getInstance()->translate($string);
  }
}

class BusinessLogic extends Allgemein
{
  public function someFunction()
  {
    echo $this->translate('__WILLKOMMEN__');
  }
}

Die Klasse BusinessLogic macht zu Beispiel das Anzeigen von News-Beträgen oder whatever...
 
1.000 Dank! Das habe ich gesucht******!

Ich bau mir einfach eine Basisklasse, die ich immer vererben kann, wenn ich sie brauch.
Danke^^
 
Das ganze könntest du auch einfach über Namespace lösen, einfach ein MyTools instanzieren und Translate aufrufen, als default Paramter würde ich englisch benutzen und wenn du Französisch bräuchtest einfach MyTools::Translate('Hallo', FRENCH); fertig. Das ist alles eine Sache von Geschmack und Sichtweise, was einem halt besser gefällt :)
 
Zurück