Je suis d'essayer d'automatiser la suppression des espaces de noms à partir d'une classe PHP collection pour les rendre PHP 5.2 compatible. (Fournisseurs d'hébergement mutualisé n'avez pas envie de voyous PHP 5.3 installations. Aucune idée de pourquoi. Aussi le code en question n'utilise pas du tout 5.3 ajouts de fonctionnalités, c'est juste que de la syntaxe. Autoconversion semble plus facile que de le faire à la main ou de réimplanter la base de code.)
Pour la réécriture de l' *.les scripts php, je suis à la base de l'exécution sur un tokenizer liste. L'identificateur de la recherche+fusion est déjà complet. Mais je suis un peu confus maintenant comment accomplir la véritable réécriture.
function rewrite($name, $namespace, $use) {
global $identifiers2; // list of known/existing classes
/*
bounty on missing code here
*/
return strtr($name, "\\", "_"); // goal: backslash to underscore
}
Cette fonction va être appelée sur chaque trouvé identifiant (si classe, de fonction ou de const). Recevoir des informations de contexte pour transformer un identifiant local dans une absolue/global $nom:
$name =
rewrite(
"classfuncconst", # <-- foreach ($names as $name)
"current\name\space",
array(
'namespc' => 'use\this\namespc',
'alias' => 'from\name\too',
...
)
);
A ce stade, j'ai déjà préparé un $identifiers2
de la liste. Il contient une liste de toutes les classes connues, les fonctions et les noms de constantes (fusionné pour des raisons de simplicité ici).
$identifiers2 = array( // Alternative suggestions welcome.
"name\space\Class" => "Class", // - list structure usable for task?
"other\ns\func1" => "func1", // - local name aliases helpful?
"blip\CONST" => "CONST", // - (ignore case-insensitivity)
L' $name
paramètre tel que reçu par l' rewrite()
fonction peut être un local, sans réserve, \absolue ou nom\espacés identificateur (mais juste identificateurs, aucune expression). L' $identifiers2
la liste est crucial pour résoudre non qualifiés identificateurs, qui peut se référer à des choses dans l'espace de noms courant, ou si elles n'y figurent pas, global choses.
Et les divers use namespace
alias doivent être pris en compte et ajouter un peu de complication en plus de l'espace de noms de la résolution et des règles de priorité.
Alors, comment et dans quel ordre serait vous essayez de convertir les variations de la classe/les noms de fonction ici?
Paresse Mentale Bounty.
Pour en faire un moins flagrant plzsendtehcodez question: un explainative liste d'instructions ou de pseudo-code, la réponse devrait être admissible trop. Et si une autre approche serait plus adapté à la tâche, veuillez donner des précisions sur cette plutôt. (Mais non, la mise à niveau de PHP ou de changer l'hébergeur n'est pas une option.)
Je crois que j'ai compris entre temps, mais la question est toujours ouverte pour les réponses / propositions de mise en œuvre. (Sinon, la prime sera bien sûr aller à nikic.)