За последние 24 часа нас посетили 222550 программистов и 2183 робота. Сейчас ищут 1578 программистов ...

Превозмогания тред

Тема в разделе "PHP для новичков", создана пользователем ubunta2, 27 июн 2017.

  1. ubunta2

    ubunta2 Зэк
    [ БАН ]

    С нами с:
    27 июн 2017
    Сообщения:
    947
    Симпатии:
    28
    PHP:
    1. <?php ## Генерация квази-анонимных функций.
    2. $squarers = [];
    3.   for ($i = 0; $i <= 1000; $i++) {
    4.     // Создаем строку, содержимое которой каждый раз будет разным.
    5.     $id = ("F".$i);
    6.     // Создаем функцию.
    7.     eval("function $id() { echo $i * $i; }");
    8.     $squarers[] = $id;
    9.   }
    10.   // Так можно вызвать функцию, чье имя берется из массива.
    11.   $squarers[303]();
    12. ?>
    была пропущена переменная из массива $i
     
  2. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Нет. Я про код, который ты сделал по совету [vs]. Там что неправильно было тобою сделано?
     
  3. ubunta2

    ubunta2 Зэк
    [ БАН ]

    С нами с:
    27 июн 2017
    Сообщения:
    947
    Симпатии:
    28
    PHP:
    1. <?php ## Генерация квази-анонимных функций.
    2. $squarers = [];
    3.   for ($i = 0; $i <= 1000; $i++) {
    4.     // Создаем строку, содержимое которой каждый раз будет разным.
    5.     $id = uniqid("F");
    6.     usleep(1000);
    7.     // Создаем функцию.
    8.     eval("function $id() { echo $i * $i; }");
    9.     $squarers[] = $id;
    10.   }
    11.   // Так можно вызвать функцию, чье имя берется из массива.
    12.   $squarers[303]();
    13.  
    14. ?>
    всмысле так?
    --- Добавлено ---
    так работает
     
  4. ubunta2

    ubunta2 Зэк
    [ БАН ]

    С нами с:
    27 июн 2017
    Сообщения:
    947
    Симпатии:
    28
    PHP:
    1. <?php ## Локальное кэширование ресурса по идентификатору.
    2.  class FileLogger
    3.   {
    4.     // Массив всех созданных объектов-журналов.
    5.     static public $loggers = [];
    6.     // Время создания объекта.
    7.     private $time;
    8.     // Закрытый конструктор: создание объектов извне запрещено!
    9.     private function __construct($fname)
    10.     {
    11.       // Запоминаем время создания этого объекта.
    12.       $this->time = microtime(true);
    13.     }
    14.     // Открытый метод, предназначенный для создания объектов класса.
    15.     // Создать новый объект можно только с его помощью!
    16.     public static function create($fname)
    17.     {
    18.       // Вначале проверяем: возможно, объект для указанного имени
    19.       // файла уже существует? Тогда его и возвращаем.
    20.       if (isset(self::$loggers[$fname]))
    21.         return self::$loggers[$fname];
    22.       // А иначе создаем полностью новый объект и сохраняем ссылку
    23.       // на него в статическом массиве.
    24.       return self::$loggers[$fname]=new self($fname);
    25.     }
    26.     // Возвращает время создания объекта.
    27.     public function getTime() { return $this->time; }
    28.     // Дальше могут идти остальные методы класса.
    29.   }
    30.   // Пример использования класса.
    31.   #$logger = new FileLogger("a"); // Нельзя! Доступ закрыт!
    32.  $logger1 = FileLogger::create("file.log"); // ОК!
    33.   sleep(1); // как будто бы программа немного поработала
    34.   $logger2 = FileLogger::create("file.log"); // ОК!
    35.   // Выводим времена создания обоих объектов.
    36.   echo "{$logger1->getTime()}, {$logger2->getTime()} ";
    37. ?>
     
  5. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    отладка
     
  6. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Попробуй на никсах запустить,
     
  7. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Хорошо. А почему? Что ты изменил, вставив эту строку кода?
    Просто почитай про эту функцию, почитай про uniqid, почитай эту тему. И сделай вывод. Не спеши. Ты не на экзамене, двойку не поставят. Важно, чтобы ты знал, а не догадывался, как работает код.
     
    Maputo нравится это.
  8. ubunta2

    ubunta2 Зэк
    [ БАН ]

    С нами с:
    27 июн 2017
    Сообщения:
    947
    Симпатии:
    28
  9. ubunta2

    ubunta2 Зэк
    [ БАН ]

    С нами с:
    27 июн 2017
    Сообщения:
    947
    Симпатии:
    28
  10. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    А, хотя винда не при чём. Не заметил.
    В книге тоже одинаковое имя файла?
     
  11. ubunta2

    ubunta2 Зэк
    [ БАН ]

    С нами с:
    27 июн 2017
    Сообщения:
    947
    Симпатии:
    28
    да, но в файлах нет такого файла
    есть test.log
     
  12. ubunta2

    ubunta2 Зэк
    [ БАН ]

    С нами с:
    27 июн 2017
    Сообщения:
    947
    Симпатии:
    28
    PHP:
    1. <?php ## Перехват обращений к членам класса.
    2.  class Hooker
    3.   {
    4.     // Обычное свойство класса.
    5.     public  $opened = 'opened';
    6.     // Обычный метод класса.
    7.     public function method() { echo "Whoa, deja vu.<br />"; }
    8.     // В этом массиве будут храниться все "виртуальные" свойства.
    9.     private $vars   = array();
    10.     // Перехват получения значения свойства.
    11.     public function __get($name)
    12.     {
    13.       echo "Перехват: получаем значение $name.<br />";
    14.       // Возвращаем null, если "виртуальное" свойство еще не определено.
    15.       return isset($this->vars[$name])? $this->vars[$name] : null;
    16.     }
    17.     // Перехват установки значения свойства.
    18.     public function __set($name, $value)
    19.     {
    20.       echo "Перехват: устанавливаем значение $name равным '$value'.<br />";
    21.       //Перед записью значения удаляем пробелы.
    22.       return $this->vars[$name] = trim($value);
    23.     }
    24.     // Перехват вызова несуществующего метода.
    25.     public function __call($name, $args)
    26.     {
    27.       echo "Перехват: вызываем $name с аргументами: ";
    28.       var_dump($args);
    29.       return $args[0];
    30.     }
    31.   }
    32.   // Иллюстрация работы класса.
    33.   $obj = new Hooker();
    34.   echo "<b>Получаем значение обычного свойства.</b><br />";
    35.   echo "Значение: {$obj->opened}<br />";
    36.   echo "<b>Вызываем обычный метод.</b><br />";
    37.   $obj->method();
    38.   echo "<b>Присваивание несуществующему свойству.</b><br />";
    39.   $obj->nonExistent = 101;
    40.   echo "<b>Получение значения несуществующего свойства.</b><br />";
    41.   echo "Значение: {$obj->nonExistent}<br />";
    42.   echo "<b>Обращение к несуществующему методу.</b><br />";
    43.   $obj->nonExistent(6);
    44. ?>
    вывелось
    Получаем значение обычного свойства.
    Значение: opened
    Вызываем обычный метод.
    Whoa, deja vu.
    Присваивание несуществующему свойству.
    Перехват: устанавливаем значение nonExistent равным '101'.
    Получение значения несуществующего свойства.
    Перехват: получаем значение nonExistent.
    Значение: 101
    Обращение к несуществующему методу.
    Перехват: вызываем nonExistent с аргументами: array(1) { [0]=> int(6) }
     
  13. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Ну так тогда же ясно, почему время одно и тоже. Даже для новичка ясно должно быть
    --- Добавлено ---
    Там даже комментарии подробнейшие
     
  14. ubunta2

    ubunta2 Зэк
    [ БАН ]

    С нами с:
    27 июн 2017
    Сообщения:
    947
    Симпатии:
    28
    02.08.2017 14:22:15
     
  15. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
  16. ubunta2

    ubunta2 Зэк
    [ БАН ]

    С нами с:
    27 июн 2017
    Сообщения:
    947
    Симпатии:
    28
    понял что вывелось
     
  17. ubunta2

    ubunta2 Зэк
    [ БАН ]

    С нами с:
    27 июн 2017
    Сообщения:
    947
    Симпатии:
    28
    PHP:
    1. <?php ## Сериализация объекта класса user
    2.  // Подключаем сериализацию класса
    3.   require_once("user.php");
    4.  
    5.   // Создаем объект
    6.   $obj = new user("nick", "password");
    7.  
    8.   // Выводим дамп объекта
    9.   echo "<pre>";
    10.   print_r($obj);
    11.   echo "</pre>";
    12.  
    13.   // Серилизуем объект
    14.   $object = serialize($obj);
    15.  
    16.   // Выводим сериализованный объект
    17.   echo $object;
    18. ?>
    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;}
     
  18. Васяня

    Васяня Активный пользователь

    С нами с:
    2 окт 2016
    Сообщения:
    238
    Симпатии:
    32
    Адрес:
    Россия, Приморский край, г. Находка.
    Что инклудится в третьей строке?
     
  19. ubunta2

    ubunta2 Зэк
    [ БАН ]

    С нами с:
    27 июн 2017
    Сообщения:
    947
    Симпатии:
    28
    PHP:
    1. <?php ## Использование метода __sleep().
    2.  class user
    3.   {
    4.     // Конструктор
    5.     public function __construct($name, $password)
    6.     {
    7.       $this->name     = $name;
    8.       $this->password = $password;
    9.       $this->referrer = $_SERVER['PHP_SELF'];
    10.       $this->time     = time();
    11.     }
    12.     public function __sleep()
    13.     {
    14.       $this->password = "";
    15.       return ['name', 'referrer', 'time'];
    16.     }
    17.  
    18.     // Имя пользователя
    19.     public $name;
    20.     // Его пароль
    21.     public $password;
    22.     // Последняя посещенная страница
    23.     public $referrer;
    24.     // Время авторизации пользователя
    25.     public $time;
    26.   }
    27. ?>
    --- Добавлено ---
    O:4:"user":3:{s:4:"name";s:4:"nick";s:8:"referrer";s:19:"/user_serialize.php";s:4:"time";i:1501747823;}
    это не пойму
     
  20. Васяня

    Васяня Активный пользователь

    С нами с:
    2 окт 2016
    Сообщения:
    238
    Симпатии:
    32
    Адрес:
    Россия, Приморский край, г. Находка.
  21. ubunta2

    ubunta2 Зэк
    [ БАН ]

    С нами с:
    27 июн 2017
    Сообщения:
    947
    Симпатии:
    28
    O:4:"user":3:{s:4:"name";s:4:"nick";s:8:"referrer";s:19:"/user_serialize.php";s:4:"time";i:1501747823;}
    логику вывода этого хочу понять
     
  22. Васяня

    Васяня Активный пользователь

    С нами с:
    2 окт 2016
    Сообщения:
    238
    Симпатии:
    32
    Адрес:
    Россия, Приморский край, г. Находка.
    Функция serialize получает массив и фигачит нам кашу. Функция unseialize получает качу отдаёт массив. Логика такая же как json_decode, json_encode.
     
  23. ubunta2

    ubunta2 Зэк
    [ БАН ]

    С нами с:
    27 июн 2017
    Сообщения:
    947
    Симпатии:
    28
    а логика
     
  24. Васяня

    Васяня Активный пользователь

    С нами с:
    2 окт 2016
    Сообщения:
    238
    Симпатии:
    32
    Адрес:
    Россия, Приморский край, г. Находка.
    Я уже объяснил и ссылки дал, читай
     
  25. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Тебе же писали уже, логика сериализации не документирована, внутри php спрятана. Определив магический метод sleep, ты просто показал, какие поля ты будешь сериализовать у своего класса