Помогите разобраться

Ilya_89

Новичок
Добрый день. Делаю примеры из Котерова, возникло небольшое непонимание.

PHP:
<?php
class File_Logger0{
	public $f, $name, $lines=array();
	public function __construct($name,$fname){
		$this->name = $name;
		$this->f = fopen($fname, "a+");
		$this->log("__construct() called!");
	}
	public function __destruct(){
		$this->log("__destruct() called!");
		fwrite($this->f, implode("", $this->lines));
		fclose($this->f);
	}
	public function log($str){
		$prefix = "[".date("d-m-Y_H:i:s ")."{$this->name}] ";
		$str = preg_replace('/^/m', $prefix, rtrim($str));
		$this->lines[] = $str."\n";
	}
}

for($i=1; $i<=2; $i++){
	$logger[$i] = new File_Logger0("test$i", "test.log");
	$logger[$i]->log("Hello! $i");
}
$logger[1]->log("Test message");
?>
Вот простой пример. Конструктор открывает файл на чтение/запись. Метод log формирует строку, записывает ее в буфер. Деструктор записывает содержимое буфера в файл и закрывает файл.

В результате работы скрипта в файле появляется нечто вроде:
__construct() called!
Hello! 1
Test message
__destruct() called!
__construct() called!
Hello! 2
__destruct() called!
Объясните мне пожалуйста почему результат именно такой, а не:
__construct() called!
Hello! 1
__construct() called!
Hello! 2
__destruct() called!
Test message
__destruct() called!
Почему "Test message" записывается в файл настолько рано? Ведь логично предположить, что оно должно записаться в файл в самом конце, уже после выполнения цикла.
 

Ilya_89

Новичок
Получается, объекту $logger[2] нужно открыть на чтение/запись тот же файл. Поэтому сначала завершаются все действия с файлом объекта $logger[1] ?
 

whirlwind

TDD infected, paranoid
Ilya_89 оно не рано записывается, а скопом. Он ведь не выводит строки в лог сразу впри вызове log, а буфферизует их. Но $logger[1] и $logger[2] - это разные объекты. Соответственно буфферы $lines у них независимые. А в деструкторе содержимое буффера сбрасывается в файл: сначала из буффера первого объекта, потом из второго.
 

Ilya_89

Новичок
Тогда почему сначала в файл сбрасывается содержимое буфера первого объекта, а не второго? Ведь с буфером первого объекта я еще работаю:
PHP:
$logger[1]->log("Test message");
К этому моменту со вторым объектом уже ничего не произойдет.
 

whirlwind

TDD infected, paranoid
Когда он сбрасывает содержимое буффера ты уже ни с чем не работаешь. Потому что это деструкторы вызваны. Здесь однозначно деструкторы вызваны после завершения программы.
 

Ilya_89

Новичок
Так получается деструкторы вызываются после завершения скрипта? Видимо я чтото невнимательно прочитал. Мне казалось, что деструктор вызывается в момент последнего обращения к данным/методам объекта.
 

whirlwind

TDD infected, paranoid
Ilya_89 а откуда PHP узнает последнее это обращение или нет? Забежит посмотреть вперед? Когда возникает какой-то подобный вопрос, нужно просто подумать, как работает программа. Ведь любой ЯП это программа и в нем нет никакой магии.

Теоретически можно считать, что деструктор вызывается при выходе из области действия. Но я не знаю ни одного языка с автоматическим управлением памятью где это верно практически.
 

Ilya_89

Новичок
Ilya_89

Почитай http://www.ozon.ru/context/detail/id/4030251/ .
Там для новичка именно то, что нужно.

Прочитаешь, попробуешь делать как там написано - приходи за дальнейшими советами. А то щас понабегут, загрузят разными мудреными советами и терминами, а толку будет мало, ибо нет владения основами.
Всем снова здравствуйте.
Прочитал главу 46 про шаблонизаторы. Описано 4 подхода в шаблонизации. Особенно заинтересовали подходы 3 и 4: MVC (Model-View-Controller), где пользователь работает с контроллером, а контроллер взаимодействует с моделью и подгружает шаблон; MVC (Model-View-Component), где пользователь работает с шаблоном, а шаблон подключает несколько независимых компонентов, каждый компонент генерирует определенный блок на странице.

Помогите определиться. Какой модели лучше придерживаться и почему?
 

Вурдалак

Продвинутый новичок
Я не совсем понял из твоих слов о чём идёт речь в последнем подходе, но непонятно тогда что ты будешь делать, если в качестве ответа клиенту должен быть JSON, XML, smth else?
 

Krishna

Продался Java
Я не совсем понял из твоих слов о чём идёт речь в последнем подходе, но непонятно тогда что ты будешь делать, если в качестве ответа клиенту должен быть JSON, XML, smth else?
Какая разница что генерируется в качестве ответа?
 

Вурдалак

Продвинутый новичок
В контроллере как раз может решаться какой именно View отдавать клиенту. А тут как-то получается, что вариантов нет: только то, что есть в шаблоне. А обработка POST-запросов как будет происходить?
 

Духовность™

Продвинутый новичок
Всем снова здравствуйте.
Прочитал главу 46 про шаблонизаторы. Описано 4 подхода в шаблонизации. Особенно заинтересовали подходы 3 и 4: MVC (Model-View-Controller), где пользователь работает с контроллером, а контроллер взаимодействует с моделью и подгружает шаблон; MVC (Model-View-Component), где пользователь работает с шаблоном, а шаблон подключает несколько независимых компонентов, каждый компонент генерирует определенный блок на странице.

Помогите определиться. Какой модели лучше придерживаться и почему?
4 подход очень тяжело реализовать. Масса подводных камней. Целая тема была про это: http://phpclub.ru/talk/threads/компонентный-подход-мвс-и-шаблоны.59528/

Коли ты новичок, я бы порекомендовал тебе пока придерживаться стандартной, 3 схемы, когда первичен контроллер (или скрипт). "Активные шаблоны" - тема сложная, ИМХО.
 

AmdY

Пью пиво
Команда форума
здесь картинки неправильные. компонентный поход не взаимоисключающий с mvc. в общем случае есть модель, вьюха, контроллер, только в контроллере или вьюхе модет делаться вызов подконтроллера (копмоненты).
ниже по быстрому набросанная карт как я понимаю MVC, дающая мне нужную гибкость.
p.s. стрелочку между контроллером и подконтроллером ещё не поставил, но лень редактировать
 

Вложения

Ilya_89

Новичок
Духовность™
Спасибо, буду придерживаться стандартной mvc схемы.
AmdY
Спасибо. Более обобщенная схема(где есть только контроллер, модель, шаблон) мне понятна. С подконтроллерами, подшаблонами, хелперами и т.п. пока не понимаю. Надеюсь, что с опытом понимание появится.

Почитал про MVC на википедии:
http://ru.wikipedia.org/wiki/Model-View-Controller
глава "Наиболее частые ошибки"
Не правильно рассматривать Модель (Model) исключительно как совокупность функций и/или методов для доступа к данным, а Контроллер (Controller) — как элемент системы, содержащий бизнес-логику.
Я себе собственно так и представлял, а это оказывает не правильно. Из написанного там так и не понял, а как же правильно.
Поясните пожалуйста.
 

Духовность™

Продвинутый новичок
глава "Наиболее частые ошибки"
Эту главу я писал)

Поясните пожалуйста.
Хорошо, что вовремя понял. Быстрее поймешь то, что более правильно.
Я бы советовал тебе начать с книги "МАРТИН ФАУЛЕР. АРХИТЕКТУРА КОРПОРАТИВНЫХ ПРОГРАММНЫХ ПРИЛОЖЕНИЙ"
это очень сложная книга, но там хорошо описано то, что тебе в дальнейшем пригодиться

http://habrahabr.ru/blogs/net/61524/
 

AmdY

Пью пиво
Команда форума
Ilya_89
на самом деле понимай mvc как совет разделять систему на независимые элементы, занимающиеся только своей частичкой работы и которые с лёгкостью можно заменить.
таких элементов не три(MVC), а довольно много, и чем их больше, тем легче будет использовать твой код, т.к. он становится гибче, легче тестируется, легче модифицируется, легче реиспользовать код, легче читать код(если имена нормальные давать).
в начале лучше не загоняться идеалогической правильностью того. что ты делаешь, а лишь стараться придерживаться бест практик хотя бы частично.
 
Сверху