2016-12-28 2 views
0

Ich habe App mit alten Code - plain php und neuen Code - Symfony. Und wenn in der alten Klasse symfony Autoloader Coderuf, vielleicht fängt Klasse, wie Symfony sagte exctly zu nennen brauchte KlasseSymfony und plain php autoload Klasse

Ich habe app/old/core/classes/Locale.php von alten Code, ohne Namensraum und app/src/AppBundle/Entity/Locale.php von neuen Code, ist diese Einheit mit Namensraum

und in alten Code nenne ich statische Funktion locale aus alten Code, aber Symfony Aufruf Einheit, natürlich Einheit locale nicht diese statische Funktion haben, und ich habe Fehler

class Page 
{ 
    function replacePageTags($replace_arr) 
    { 
     // set brases for keys 
     $braced_arr = Array(); 

     foreach($replace_arr as $key => $value) { 
      $braced_arr["{".$key."}"] = $value; 
     } 

     //this I have error 
     $this->content = Locale::replaceTags($this->content, $braced_arr); 
    } 
} 

Fehlermeldung:

Attempted to call an undefined method named "replaceTags" of class "Locale".

WHE I umfassen add Locale-Klasse Seite

include('Locale.php'); 

class Page 
{ 

haben Fehler

Error: Cannot declare class Locale, because the name is already in use

Aber wenn ich zu Entität hinzufügen static function replaceTags($text, $replace_arr) noch Fehler haben, vielleicht Symfony eine andere Locale nennen, aber ich nenne brauchen Gebietsschema aus alter Funktionalität, wie kann ich das tun?

vielleicht, weil dies in Komponisten in automatisch geladen Ich habe

"autoload": { 
    "psr-4": { 
     "": "src/" 
    } 

aber alter Code nicht in src oder ich nicht

In einem anderen Entwickler weiß, haben nicht dieses Problem, ich habe PHP-Version 7.0.14, sie haben 7.0.8, vielleicht brauche ich wenig ph-Beschränkung, ich weiß nicht ( Wie man dringend benötigte Klasse in altem Code nennt oder dieses Problem behebt?

+0

Bitte fügen Sie die tatsächliche Fehlermeldung zur Frage hinzu. Ist die Erweiterung [intl] (http://php.net/manual/en/book.intl.php) aktiviert? –

+0

Fehlermeldung 'Versucht, eine undefinierte Methode mit dem Namen" replaceTags "der Klasse" Locale "aufzurufen.' Da symfony eine andere calss mit dem Namen Locale aufruft, denke ich –

+0

Also, was ist mit der Erweiterung? Bestätigen Sie 'php -m | grep intl' gibt nichts zurück? –

Antwort

2

Ihre Page Klasse verwendet \Locale von intl Erweiterung einen benutzerdefinierten Namespace wie Legacy\Class für alle alten Klassen haben könnte.

Die einzige Option, die Sie haben, ist die Erweiterung zu deaktivieren, da der Legacy-Code (namespaceless) aufgrund von Kollision des Klassennamens nicht damit kompatibel ist.

+0

wie man die Erweiterung deaktiviert? –

+0

hängt davon ab, wie Sie es installiert haben. 'pecl deinstallieren intl',' apt-get entfernen php5-intl' etc. –

+1

Wenn Sie etwas wie 'intl.ini' in php configs finden können, z.'/ etc/php5/mods-available', du kannst es auskommen liek'; Erweiterung = intl.ini' –

0

Wenn Ihre alte Bibliothek keinen Namensraum hat, können Sie Verwenden Sie MapClassLoader um zu tun apping.

require_once '/path/to/src/Symfony/Component/ClassLoader/MapClassLoader.php'; 

$mapping = array(
    'Foo' => '/path/to/Foo', 
    'Bar' => '/path/to/Bar', 
); 

$loader = new MapClassLoader($mapping); 

$loader->register(); 

Sie können es automatisch auf dem alten Code von the class map generator verwenden. Auf diese Weise können

+0

Wenn es das Problem war, würde ich empfehlen, Komponist verwenden, um Klassen stattdessen zuordnen. –