MB: Was ist __( ) für eine Translations-Funktion?

moin,

ich habe diese funktion __() schon in Tutorials gesehen ohne "Standart" Frameworks wie Wordpress oder CakePHP.

Der Tutor hat diese Funktion verwendet um Texte in andere Sprachen umzuwanden. Zuerst hat er den Source fest gelegt z.B. de.php:

return [
    'test' => 'Beispieltext'
];

Hier die Übersetzer Klasse Lang.class.php:

<?php

class Lang {

    protected static $data;

    public function load( string $lang_code ) {
        $lang_file_path = ROOT . DS . 'lang' . DS . strtolower( $lang_code ) . '.php';
        if( file_exists( $lang_file_path ) ) {
            self::$data = include( $lang_file_path );
        } else {
            throw new Exception( 'lang file not found: ' . $lang_file_path );
        }
    }
    
    public static function get( string $key, string $default_value ) : string {
        return isset( self::$data[ strtolower( $key ) ] )
           ? self::$data[ strtolower( $key ) ]
           : $default_value;
    }
    
}

Er hat diese Klasse in einer App aufgerufen Lang::load( 'de' ); und im HTML-Code intern den PHP-Code ausgegeben mit <?=__( 'lng.test' )?>

Ich habe keinen blassen schimmer wie im HTML-Code __( 'test' ) da Beispieltext raus gekommen ist. Natürlich ghabe ich es auch versucht ging aber sehr schief

Fatal error:  Uncaught Error: Call to undefined function __()

Auch all ich den Code vom Tutor auf das minimalste reduziert habe klappts auch nicht 😕. Erst als ich dann die Namespaces hinter den eigentliche Klasse geschrieben habe und die Methode get mit diesem Parameter 'test' aufgerufen habe funktioniert es wie erwartet.

Was hat das mit dere Funktion __( ) aufsich? Ist das von PHP vordefinierte Funktion? Wie kann man diese Funktion richtig nutzen?

lg

  1. Hallo MB,

    hier ist was oberfaul.

    Lang::load sollte eine statische Methode aufrufen, aber diese Methode ist nicht statisch implementiert.

    Methoden mit __ Präfix sind von PHP reserviert, für „magic methods“, aber eine von PHP implementierte __ Methode gibt's in der Doku nicht.

    Es gibt __get, das wird von PHP aufgerufen wenn auf undeklarierte Eigenschaften eines Objekts zugegriffen wird. Diese Methode darf aber nicht statisch implementiert sein.

    Meiner Vermutung nach ist in deiner Mitschrift was durcheinander oder unvollständig.

    Rolf

    --
    sumpsi - posui - clusi
    1. moin RolfB,

      Es gibt __get, das wird von PHP aufgerufen wenn auf undeklarierte Eigenschaften eines Objekts zugegriffen wird. Diese Methode darf aber nicht statisch implementiert sein.

      ach so :)!!! So läuft der Hase. Ich wusste nicht dass in diesem Kontext auch geht Ich denke Dir sehr herzlich.

      Meiner Vermutung nach ist in deiner Mitschrift was durcheinander oder unvollständig.

      Das kann sehr gut sein. Ich guck mal im Tutorial nach. Danke nochmals.

      lgMB

    2. Tach!

      hier ist was oberfaul.

      Lang::load sollte eine statische Methode aufrufen, aber diese Methode ist nicht statisch implementiert.

      Das ergibt nur eine ganz kleine Deprecated-Meldung, wird aber ansonsten ausgeführt.

      Methoden mit __ Präfix sind von PHP reserviert, für „magic methods“, aber eine von PHP implementierte __ Methode gibt's in der Doku nicht.

      Aber es gibt _() als Alias zu gettext(). Das ist eine recht übliche Funktion aus dem Dunstkreis der gettext-Library.

      Meiner Vermutung nach ist in deiner Mitschrift was durcheinander oder unvollständig.

      Da wird irgendwo __() als Funktion deklariert worden sein. Wenn man eine IDE hat, die auch die Pfade zu den verwendeten Librarys kennt, genügt ein Tastendruck, um die Quelle zu finden (Go to declaration).

      dedlfix.