Частый гость
Покинул форум
Сообщений всего: 139
Дата рег-ции: Дек. 2014
Откуда: Киров, Россия
Помог: 11 раз(а)
|
Простыми словами.
--
Статическое свойство для чего?
На примере процедурного стиля:
Задача:
Вам нужно вывести комментарии пользователей к какой-то статье из базы данных или файла или бог знает откуда еще...
И при этом как-то обработать их, на пример, заменить символы в строке типа " " или ":-D" на картинку со смайликами.
Пишем простую функцию для замены: (для примера будем использовать strtr()) // синтаксис PHP 5.4+
PHP:
скопировать код в буфер обмена
//Передаем в функцию текст и меняем нужные символы на картинки function smile($text) { $smiles = [ ":)" => "<img src='smile/1.gif'>", ":-D" => "<img src='smile/2.gif'>" ] return strtr($text,$smiles); }
на выходе мы имеем строку уже с картинками вместо '',':-D'.
Данная функция правильно отрабатывает, НО!
Если вы хотите вывести все 50 комментариев , то вы будете 50 раз вызывать эту функцию и инициализация массива с заменой смайлов, будет происходить так же 50 раз.
Поэтому целесообразно массив объявить статическим, добавив static. Создастся он всего один раз. Ведь мы не меняем его и не передаем в функцию из вне... он всегда один и тот же.
PHP:
скопировать код в буфер обмена
function smile($text) { static $smiles = [ ":)" => "<img src='smile/1.gif'>", ":-D" => "<img src='smile/2.gif'>" ] return strtr($text,$smiles); }
Примерно то же самое и в объектах. Где это используется?
Далеко ходить не буду. Работа с Базой данных и паттерн singleton
Вы описываете свой класс, который подключается к базе данных.
Вы можете его унаследовать, но в каких-то местах, это не получится и вам опять придется соединиться с базой данных.
Что бы не плодить объекты, используем singleton.
На пример, по простому опишем свой класс для создания соединения с БД Mysql с помощью PDO:
PHP:
скопировать код в буфер обмена
class DataBase { //простое свойство, где будет храниться объект PDO private $db; // Вот и статическое свойство, которое создасться всего один раз при вызове объекта и будет хранить в себе сам объект private static $instance; // конструктор сделаем приватным, что бы извне нельзя было его вызвать private function __construct() { try { $this->db = new PDO('mysql:host=host;dbname=db_name;charset=utf-8', 'login', 'password'); // тут любые настройки, какие хотите $this->db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); }catch(PDOException $e) { // обрабатываем ошибку } } // метод для создания объекта. Здесь проверяется, если объект уже cуществует, то мы его и вернем, если не создан то создадим и вернем. static public function getInstance() { if(self::$instance instanceof self) { return self::$instance; } return self::$instance = new self; } }
Для чего это всё? Для того, что бы объект не создавался больше чем один раз, независимо от того, сколько бы раз мы его не попытались создать.
т.е.
PHP:
скопировать код в буфер обмена
//создаем пять раз // т.к. нам нужно вызвать статический метод, обращаемся к нему через :: $db1 = DataBase::getInstance(); $db2 = DataBase::getInstance(); $db3 = DataBase::getInstance(); $db4 = DataBase::getInstance(); $db5 = DataBase::getInstance();
Во всех $db* будет находится один и тот же объект
Если бы класс был описан как НЕ singleton, то при создании экземпляра класса, создавалось бы столько объектов, сколько раз его вызвали
Во всех $db* свой объект
--
Теперь о статических методах
Вы решили создать какой-то класс с помощью которого вы хотите как-то очищать входящие данные. Там много всяких, разных метотодов... мы создадим такой, но с одним методом. для примера.
Что он делает? Да ничего особенного, метод clearString удаляет все теги,пробелы в строке и возвращает обратно;
И вот, наступил момент, когда вам где-то понадобился этот метод. Что нужно сделать что бы он было доступен? Правильно. Создать экземпляр класса Validator и вызвать этот метод.
PHP:
скопировать код в буфер обмена
//строка, в которой нужно очистить все теги $string = 'Какая-то строка, содержащая <script>alert("ололо")</script>'; //создаем экземпляр класса Validator $valid = new Validator(); // очищаем строку $string = $valid->clearString($string);
Что мы сделали? Создали объект ради одного метода.А ведь сам объект может нам и не понадобится никогда. Поэтому сделаем его статическим. Для того, что бы можно было воспользоваться этим методом не создавая сам объект.
Перепишем класс и объявим метод clearString статическим:
И теперь, что бы очистить нашу строку :
PHP:
скопировать код в буфер обмена
$string = 'Какая-то строка, содержащая <script>alert("ололо")</script>'; // вызываем статический метод объекта Validator не создавая сам объект, только уже не через стрелу ->, а через :: $string = Validator::clearString($string);
Вот в общем то и всё. Может я как-то не совсем понятно объяснил, но постарался передать всё в более простой форме...
спасибо за внимание (Отредактировано автором: 20 Декабря, 2014 - 01:16:59)
|