что-то не так с использованием html внутри функции класса? Я называю это в DOM, поэтому мне не нужна строка, возвращаемая.
public function the_contact_table(){ ?> <div> some html here </div> <?php }
Также, когда мне нужна строка, я использую этот метод? Есть ли лучший способ или это относительно стандарт?
public function get_single(){ ob_start();?> <div class='staff-member single'> <div class='col left'> <div class='thumbnail'> thumbnail </div> <?php $this->the_contact_table(); ?> </div> <div class='col right'> </div> </div> <?php $content = ob_get_contents(); ob_end_clean(); return $content; }
ОБНОВИТЬ
Я должен был объяснить, почему я это делаю. Я делаю плагин WordPress и хочу контролировать вывод типа сообщений. Поэтому я использую фильтр, как показано ниже.
public function filter_single($content){ global $post; if ($post->post_type == 'staff-member') { $sm = new JM_Staff_Member($post); $content = $sm->get_single(); } return $content; }
Итак, как вы можете видеть, я должен вернуть строку в ядро wordpress
Вы должны использовать HEREDOC вместо буферизации вывода, если хотите сохранить длинную строку в переменной. Это выглядит так:
$content = <<<EOD content here EOD;
EOD
может быть чем угодно, но обратите внимание на две важные вещи:
Если вы используете PHP> = 5.3, вам следует использовать NOWDOC, который не анализирует переменную внутри документа (если вам это не нужно). Единственным отличием от синтаксиса NOWDOC является то, что дозорчик заключен в кавычки:
$content = <<<'EOD' content here EOD;
Причина, по которой я отклонился от буферизации вывода, заключается в том, что он не позволяет серверу передавать данные, отправленные клиенту. Это означает, что запросы будут выглядеть медленнее, потому что вместо того, чтобы контент постепенно отправлялся клиенту и отображался, он вынужден быть отправлен сразу. Буферизация вывода – это взлом для ситуаций, когда функции небрежно echo
данные вместо того, чтобы возвращать его или инструмент для определенных приложений с конкретной потребностью в нем. Я также предполагаю, что вы нанесли удар по времени выполнения, если вы использовали буферизацию вывода (потому что она включает вызовы функций) по сравнению с HEREDOCing в переменную или включающую представление.
Теперь, чтобы ответить на вопрос о том, подходит ли это, я бы сказал, что в приложении MVC весь HTML и другой контент должны содержаться в его собственном представлении. Затем контроллер может вызывать представление для отображения самого себя и не должен беспокоиться о знании кода, участвующего в отображении представления. Вы все равно можете передавать информацию (например, заголовки, авторы, массивы тегов и т. Д.), Но цель здесь – отделить контент от логики.
Тем не менее, шаблоны WordPress и код выглядят довольно неряшливо для начала и свободно, если вообще не реализуют MVC, поэтому, если слишком много работы для создания представления для этого, я бы сказал, что неряшливость будет соответствовать стилю WP.
Это не очень хорошая практика в отношении того, что вы отчуждаете разработчиков интерфейсов, размещая то, что на самом деле является «представлениями» внутри файлов классов PHP. Это была одна из моих самых больших проблем, когда я впервые начал использовать PHP в целом, это то, что я хотел динамически создавать контент внутри классов. Это отличная идея, но вы хотите сделать это таким образом, чтобы многие члены вашей команды могли работать вместе как можно более гладко;].
Вероятно, вы должны иметь содержимое внутри отдельного файла, называемого «staff-member-single.php», который вы затем вызываете в своей функции
public function get_single(){ ob_start(); require_once('views/staff-member-single.php'); $content = ob_get_contents(); ob_end_clean(); return $content; }
Вы бы реорганизовали это в метод многократного использования, хотя, так что это выглядело бы немного как ..
public function get_single() { $string = $this->render_view_as_string('satff-member-single'); return $string; } public function render_view($view) { require('views/'.$view.'.php'); } public function render_view_as_string($view) { ob_start(); $this->render_view($view); $content = ob_get_contents(); ob_end_clean(); return $content; }
.public function get_single() { $string = $this->render_view_as_string('satff-member-single'); return $string; } public function render_view($view) { require('views/'.$view.'.php'); } public function render_view_as_string($view) { ob_start(); $this->render_view($view); $content = ob_get_contents(); ob_end_clean(); return $content; }
Я считаю хорошей практикой использовать PHP только для логики приложения и передачи некоторых данных для просмотра слоя (механизма шаблонов). В соответствии с этим существуют некоторые шаблоны, такие как MVC.