PHP - объединение объектов и приведение к строке - плохая идея? - PullRequest
1 голос
/ 10 апреля 2010

Это плохая практика для объединения объектов при использовании в этом контексте:

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

Это способ, которым я обычно добавляю дополнительные CSS / JS вещи на определенные страницы. Я использую структуру MVC, где мой базовый HTML-шаблон имеет переменную $ head, которую я установил в своем основном Website_controller. Некоторое время я использовал этот подход, так как он означает, что я могу просто добавлять кусочки кусочков css / js с любой страницы / контроллера, где это необходимо. Но, столкнувшись с проблемой в PHP 5.1.6, когда приведенный выше код приводит к «Идентификатору объекта # 24», результат toString () не вызывается, я думаю, я переосмысливаю, нужно ли это просто исправить, чтобы работать в PHP 5.1 .6 или я должен переосмыслить этот подход в целом.

Любые указатели оценены!

Ответы [ 4 ]

1 голос
/ 10 апреля 2010

Вы можете только объединять строки - поэтому (при условии, что он не просто сгенерирует ошибку и умрет), этот код будет сериализовать объект перед добавлением его в строку. Хотя у вас может быть метод toString () для генерации HTML, он не будет работать с «новой» конструкцией, которая является , а не функцией.

Предположительно, вы хотите создать некоторый HTML-код из объекта в какой-то момент. В этом случае вы должны быть что-то вроде:

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

Хотя создание целого нового объекта просто для переноса строки в некоторую HTML-разметку очень расточительно - я бы пошел с набором методов для этого - скажем ...

$this->template->head->addJs('custom_javascript');
$this->template->head->addCSS('make_it_look_funky');
...
1 голос
/ 10 апреля 2010

Вы всегда можете использовать View как фабричный объект, передавая его как строку в шаблон с помощью функции render () (или как хотите, чтобы она вызывалась), поэтому код, который у вас есть, будет выглядеть примерно так:

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

визуализируется за момент до того, как оно передается в шаблон.

Например, Kohana 3 использует этот шаблон для работы с представлениями / шаблонами, вы можете узнать больше об этом на неофициальной вики

0 голосов
/ 24 августа 2010

Объекты с магическим методом __toString () автоматически преобразуются в строки, только если они используются в качестве строк, начиная с PHP 5.2.0. В этом случае, поскольку вы используете 5.1.6, вы должны привести объект как строку вручную, так что это будет:

$this->template->head .= (string) new View('custom_javascript');
0 голосов
/ 10 апреля 2010

Похоже, неправильный подход ко мне. Это плохая идея - создавать шаблоны где-то в контроллере (судя по вашему коду) путем объединения строк. Лучше вставьте все необходимые блоки прямо из teamplate, как это:

controller:

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

template:

<html>
<head>
<title><?= $title ?></title>
<?= Html::script($var_script) ?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...