2010-04-10 3 views
1

Est-il une mauvaise pratique aux objets concaténer lorsqu'ils sont utilisés dans ce contexte:PHP - Concaténation d'objets et coulée de cordes - mauvaise idée?

$this->template->head .= new View('custom_javascript') 

C'est la façon dont j'ajouter normalement css supplémentaire/js choses à des pages spécifiques. J'utilise une structure MVC où mon template html de base a une variable $ head que je place dans mon site web_controller principal. J'ai utilisé cette approche pendant un certain temps, car cela signifie que je peux juste ajouter des éléments de css/js de n'importe quelle page/contrôleur a besoin. Mais ayant rencontré un problème en PHP 5.1.6 où le code ci-dessus aboutit à "Object ID # 24", le résultat de toString() n'étant pas appelé je pense, je suis en train de repenser si je devrais juste corriger cela pour fonctionner en PHP 5.1 .6 ou si je devais repenser cette approche en général.

N'importe quel pointeur apprécié!

+0

Avez-vous réellement des cas d'utilisation où PHP 5.1.6 est utilisé? –

+0

J'ai un projet unique où je n'ai pas d'autre choix que de travailler avec 5.1.6, malgré les problèmes de sécurité avec cette version. – franko75

Répondre

1

Vous pouvez toujours utiliser View comme un objet d'usine, en le passant comme une chaîne à un modèle avec une fonction render() (ou tout ce que vous voulez appeler), donc le code que vous avez là ressemblerait à;

$this->template->head .= View::factory('custom_javascript')->render() 

étant rendu au moment où il est passé au modèle.

Kohana 3 par exemple utilise ce modèle pour travailler avec vues/modèles, vous pouvez en lire davantage at unofficial wiki

+0

Merci Kemo, je suis sur Kohana 2.3.4 mais l'exemple que vous avez fourni fonctionnera également dans cette version. Pensez-vous qu'il est normal d'utiliser ce type d'approche dans le contexte de l'ajout de js/css spécifique au contrôleur? – franko75

0

On dirait une mauvaise approche pour moi. C'est une mauvaise idée de construire des modèles quelque part dans le contrôleur (à en juger par votre code) en concaténant des chaînes. Mieux insérer tous les blocs nécessaires directement à partir Teamplate comme ceci:

controller: 

// setup template variable 
$this->template->var_script = 'custom_javascript'; 
$this->template->render(); 

template: 

<html> 
<head> 
<title><?= $title ?></title> 
<?= Html::script($var_script) ?> 
1

Vous ne pouvez concaténer des chaînes - donc (en supposant qu'il ne se contente pas jeter une erreur et mourir) ce code sérialise l'objet avant de l'ajouter à une chaîne . Bien que vous puissiez avoir une méthode toString() pour générer le code HTML, cela ne fonctionnera pas avec la nouvelle construction, qui est et non une fonction.

Vraisemblablement, vous voulez générer du code html à partir de l'objet à un moment donné. Dans ce cas, vous devriez être quelque chose comme:

$obj=new View('custom_javascript') 
$this->template->head . $obj->generateHtml(); 

Bien que la création d'un nouvel objet tout juste pour envelopper une chaîne dans quelques balises HTML est très inutile - je partirais avec un ensemble de méthodes pour ce faire - dire. ..

$this->template->head->addJs('custom_javascript'); 
$this->template->head->addCSS('make_it_look_funky'); 
... 
0

objets avec une méthode magique __toString() ne sont automatiquement converties en chaînes quand ils sont utilisés comme des chaînes à partir de PHP 5.2.0. Dans ce cas, puisque vous utilisez 5.1.6, vous devez lancer l'objet comme une chaîne à la main, ce qui serait:

$this->template->head .= (string) new View('custom_javascript'); 
Questions connexes