PHP: <?php ## Генерация квази-анонимных функций. $squarers = []; for ($i = 0; $i <= 1000; $i++) { // Создаем строку, содержимое которой каждый раз будет разным. $id = ("F".$i); // Создаем функцию. eval("function $id() { echo $i * $i; }"); $squarers[] = $id; } // Так можно вызвать функцию, чье имя берется из массива. $squarers[303](); ?> была пропущена переменная из массива $i
PHP: <?php ## Генерация квази-анонимных функций. $squarers = []; for ($i = 0; $i <= 1000; $i++) { // Создаем строку, содержимое которой каждый раз будет разным. $id = uniqid("F"); usleep(1000); // Создаем функцию. eval("function $id() { echo $i * $i; }"); $squarers[] = $id; } // Так можно вызвать функцию, чье имя берется из массива. $squarers[303](); ?> всмысле так? --- Добавлено --- так работает
PHP: <?php ## Локальное кэширование ресурса по идентификатору. class FileLogger { // Массив всех созданных объектов-журналов. static public $loggers = []; // Время создания объекта. private $time; // Закрытый конструктор: создание объектов извне запрещено! private function __construct($fname) { // Запоминаем время создания этого объекта. $this->time = microtime(true); } // Открытый метод, предназначенный для создания объектов класса. // Создать новый объект можно только с его помощью! public static function create($fname) { // Вначале проверяем: возможно, объект для указанного имени // файла уже существует? Тогда его и возвращаем. if (isset(self::$loggers[$fname])) return self::$loggers[$fname]; // А иначе создаем полностью новый объект и сохраняем ссылку // на него в статическом массиве. return self::$loggers[$fname]=new self($fname); } // Возвращает время создания объекта. public function getTime() { return $this->time; } // Дальше могут идти остальные методы класса. } // Пример использования класса. #$logger = new FileLogger("a"); // Нельзя! Доступ закрыт! $logger1 = FileLogger::create("file.log"); // ОК! sleep(1); // как будто бы программа немного поработала $logger2 = FileLogger::create("file.log"); // ОК! // Выводим времена создания обоих объектов. echo "{$logger1->getTime()}, {$logger2->getTime()} "; ?>
Хорошо. А почему? Что ты изменил, вставив эту строку кода? Просто почитай про эту функцию, почитай про uniqid, почитай эту тему. И сделай вывод. Не спеши. Ты не на экзамене, двойку не поставят. Важно, чтобы ты знал, а не догадывался, как работает код.
PHP: <?php ## Перехват обращений к членам класса. class Hooker { // Обычное свойство класса. public $opened = 'opened'; // Обычный метод класса. public function method() { echo "Whoa, deja vu.<br />"; } // В этом массиве будут храниться все "виртуальные" свойства. private $vars = array(); // Перехват получения значения свойства. public function __get($name) { echo "Перехват: получаем значение $name.<br />"; // Возвращаем null, если "виртуальное" свойство еще не определено. return isset($this->vars[$name])? $this->vars[$name] : null; } // Перехват установки значения свойства. public function __set($name, $value) { echo "Перехват: устанавливаем значение $name равным '$value'.<br />"; //Перед записью значения удаляем пробелы. return $this->vars[$name] = trim($value); } // Перехват вызова несуществующего метода. public function __call($name, $args) { echo "Перехват: вызываем $name с аргументами: "; var_dump($args); return $args[0]; } } // Иллюстрация работы класса. $obj = new Hooker(); echo "<b>Получаем значение обычного свойства.</b><br />"; echo "Значение: {$obj->opened}<br />"; echo "<b>Вызываем обычный метод.</b><br />"; $obj->method(); echo "<b>Присваивание несуществующему свойству.</b><br />"; $obj->nonExistent = 101; echo "<b>Получение значения несуществующего свойства.</b><br />"; echo "Значение: {$obj->nonExistent}<br />"; echo "<b>Обращение к несуществующему методу.</b><br />"; $obj->nonExistent(6); ?> вывелось Получаем значение обычного свойства. Значение: opened Вызываем обычный метод. Whoa, deja vu. Присваивание несуществующему свойству. Перехват: устанавливаем значение nonExistent равным '101'. Получение значения несуществующего свойства. Перехват: получаем значение nonExistent. Значение: 101 Обращение к несуществующему методу. Перехват: вызываем nonExistent с аргументами: array(1) { [0]=> int(6) }
Ну так тогда же ясно, почему время одно и тоже. Даже для новичка ясно должно быть --- Добавлено --- Там даже комментарии подробнейшие
PHP: <?php ## Сериализация объекта класса user // Подключаем сериализацию класса require_once("user.php"); // Создаем объект $obj = new user("nick", "password"); // Выводим дамп объекта echo "<pre>"; print_r($obj); echo "</pre>"; // Серилизуем объект $object = serialize($obj); // Выводим сериализованный объект echo $object; ?> user Object ( [name] => nick [password] => password [referrer] => /user_serialize.php [time] => 1501747823 ) O:4:"user":3:{s:4:"name";s:4:"nick";s:8:"referrer";s:19:"/user_serialize.php";s:4:"time";i:1501747823;}
PHP: <?php ## Использование метода __sleep(). class user { // Конструктор public function __construct($name, $password) { $this->name = $name; $this->password = $password; $this->referrer = $_SERVER['PHP_SELF']; $this->time = time(); } public function __sleep() { $this->password = ""; return ['name', 'referrer', 'time']; } // Имя пользователя public $name; // Его пароль public $password; // Последняя посещенная страница public $referrer; // Время авторизации пользователя public $time; } ?> --- Добавлено --- O:4:"user":3:{s:4:"name";s:4:"nick";s:8:"referrer";s:19:"/user_serialize.php";s:4:"time";i:1501747823;} это не пойму
Не чего этот код не делает, кроме то что вывода var_dump и сериализованного объекта Стоит почитать: https://php.ru/manual/language.oop5.basic.html
O:4:"user":3:{s:4:"name";s:4:"nick";s:8:"referrer";s:19:"/user_serialize.php";s:4:"time";i:1501747823;} логику вывода этого хочу понять
Функция serialize получает массив и фигачит нам кашу. Функция unseialize получает качу отдаёт массив. Логика такая же как json_decode, json_encode.
Тебе же писали уже, логика сериализации не документирована, внутри php спрятана. Определив магический метод sleep, ты просто показал, какие поля ты будешь сериализовать у своего класса