@Div-Man

Почему не вызывается статический метод?

Читаю Котерова, решил совместить упражнения на 435 странице и на 445, обращаюсь к create 3 раза, почему записывается только 2 лога, а не 3?

<?php 
	class FileLogger {
		//массив всех созданных объектов-журналов
		static public $loggers = [];
		
		static public $f;
		static public $name;
		static public $lines = [];
		
		public function __destruct() {
			$this->log('Создался объект');
			fputs(self::$f, join(self::$lines));
			fclose(self::$f);
		}
		
		//открытый метод, предназначенный для создания объектов класса.
		//Создать новый объект можно только с его помощью
		
		public static function create($name, $fname) {
			//Вначале проверяем: возможно, объект для указанного имени 
			//файла уже существует? Тогда его и возвращаем.
			
			
			if(isset(self::$loggers[$fname])) {
			
				return self::$loggers[$fname];
			}
			
			//А иначе создаём полностью новый объект и сохраняем ссылку
			//на него в статическом массиве
			
			self::$name = $name;
			self::$f = fopen($fname, 'a+');
			self::log('Создался объект');
				
			return self::$loggers[$fname] = new self($fname);
		}
		
		public static function log($str) {
			$data1 = new DateTime('', new DateTimeZone('Europe/Moscow'));
			$hour = $data1->format('Y-m-d H:i:s');
			$prefix = '['.$hour. ' ' . self::$name . ']';
			$str = preg_replace('/^/m', $prefix, rtrim($str));
			 self::$lines[]=$str."\r\n";
		}
	}
	
	$logger1 = FileLogger::create('test', "file.log");
	$logger2 = FileLogger::create('test', "file.log");
	$logger2 = FileLogger::create('test', "file.log");
?>
  • Вопрос задан
  • 145 просмотров
Пригласить эксперта
Ответы на вопрос 1
shaks
@shaks
Дык, батенька) во первых.
public function __destruct() {
      $this->log('Создался объект');


не "создался", а уничтожился. раз, не $this->log а self::$log два. (у тебя ж статический метод то)
И ты хоть 20 раз напиши в конце файла FileLogger::create('test', "file.log");, записей больше не увидишь. Объясняю почему:

Деструктор класса срабатывает когда? правильно, когда разрушается объект. А объект у тебя разрушается когда? правильно, когда завершается работа скрипта. А разрушается он 1 раз а не 3 почему? потому что объект у тебя один.
Взгляни внимательно на функцию create , особенно на эту запись
if(isset(self::$loggers[$fname])) {
      
        return self::$loggers[$fname];
      }

и обрати внимание какое имя файла ты передаешь своему логгеру и да придет тебе озарение юный падаван.

!! Для более глубокого понимания, советую поставить xdebug, и глянуть пошагово что происходит и как.

P.S. Не вздумай даже этот логгер использовать гдето на практике. Автор видимо хотел чтото объяснить этим кодом, а не написать логгер. Ибо это дичь.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы