Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Статические свойства и методы

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
Pavelbeginner
Отправлено: 21 Сентября, 2011 - 23:42:29
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 882
Дата рег-ции: Март 2010  


Помог: 1 раз(а)




Правильно ли я понимаю предназначение статических свойств и методов класса?
1) Статические свойства хранят в себе значения, общие для всех объектов?
2) Можно ли общаться к статическим свойствам не из объектов?
3) Можно ли из объекта менять значения статических свойств?
4) Как обращаться к статическим свойствам из объекта?
5) Для доступа к статическим свойствам нужны статические методы?
6) Для чего нужны статические методы.

Извините, Вы можете, конечно, сказать иди и почитай, но я уже прочел, но все равно не понял.
 
 Top
OrmaJever Модератор
Отправлено: 21 Сентября, 2011 - 23:51:26
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




1) нито что бы общие, они хранят значение класа а клас уже делает обьекты. Но по сути оно общее для всех обьектов этого класа
2) не можно, а только так и нужно
3) из обьекта нет
4) п.2 из обьекта не как, только по имени класса или ключевому слову (если внутри класа)
5) нет, метод может быть обычный просто свойство должно вызыватся по имени класа
6) не самый идеальный пример, но в singlton'e они используются [url]http://ru.wikipedia.org/wiki/Одиночка_(шаблон_проектирования)[/url] без них некак Улыбка


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
caballero
Отправлено: 22 Сентября, 2011 - 00:36:35
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




1) Статические свойства хранят в себе значения, общие для всех объектов?
значения безусловно общие но они могут существовать и без объектов
2) Можно ли общаться к статическим свойствам не из объектов?
для того они и созданы но вопрос неточен - не создавая объектов
3) Можно ли из объекта менять значения статических свойств?
а как же
4) Как обращаться к статическим свойствам из объекта?
как к обычным cвойcтвам но стилистически правильно через self::
5) Для доступа к статическим свойствам нужны статические методы?
обычно да но ничто не мешает обращатся через методы екземпляров
6) Для чего нужны статические методы.

для функций общих для класса но не требующих наличия экземпляра.
Например для всякого рода фабричных методов.


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
jumper423
Отправлено: 19 Декабря, 2014 - 16:33:24
Post Id


Новичок


Покинул форум
Сообщений всего: 2
Дата рег-ции: Дек. 2014  


Помог: 0 раз(а)




Вот в каких ситуациях актуально использовать статические методы
http://www[dot]infoblog1[dot]ru/blog/web[dot][dot][dot]icheskie-metodyi
 
 Top
skiphog
Отправлено: 20 Декабря, 2014 - 00:57:10
Post Id



Частый гость


Покинул форум
Сообщений всего: 139
Дата рег-ции: Дек. 2014  
Откуда: Киров, Россия


Помог: 11 раз(а)




Простыми словами.
--
Статическое свойство для чего?

На примере процедурного стиля:

Задача:
Вам нужно вывести комментарии пользователей к какой-то статье из базы данных или файла или бог знает откуда еще...
И при этом как-то обработать их, на пример, заменить символы в строке типа "Улыбка" или ":-D" на картинку со смайликами.

Пишем простую функцию для замены: (для примера будем использовать strtr()) // синтаксис PHP 5.4+
PHP:
скопировать код в буфер обмена
  1. //Передаем в функцию текст и меняем нужные символы на картинки
  2. function smile($text) {
  3.   $smiles = [
  4.     ":)" => "<img src='smile/1.gif'>",
  5.     ":-D" => "<img src='smile/2.gif'>"
  6.   ]
  7. return strtr($text,$smiles);
  8. }

на выходе мы имеем строку уже с картинками вместо 'Улыбка',':-D'.
Данная функция правильно отрабатывает, НО!
Если вы хотите вывести все 50 комментариев , то вы будете 50 раз вызывать эту функцию и инициализация массива с заменой смайлов, будет происходить так же 50 раз.
Поэтому целесообразно массив объявить статическим, добавив static. Создастся он всего один раз. Ведь мы не меняем его и не передаем в функцию из вне... он всегда один и тот же.
PHP:
скопировать код в буфер обмена
  1. function smile($text) {
  2.   static $smiles = [
  3.     ":)" => "<img src='smile/1.gif'>",
  4.     ":-D" => "<img src='smile/2.gif'>"
  5.   ]
  6. return strtr($text,$smiles);
  7. }


Примерно то же самое и в объектах. Где это используется?
Далеко ходить не буду. Работа с Базой данных и паттерн singleton

Вы описываете свой класс, который подключается к базе данных.
Вы можете его унаследовать, но в каких-то местах, это не получится и вам опять придется соединиться с базой данных.
Что бы не плодить объекты, используем singleton.
На пример, по простому опишем свой класс для создания соединения с БД Mysql с помощью PDO:

PHP:
скопировать код в буфер обмена
  1. class DataBase {
  2.   //простое свойство, где будет храниться объект PDO
  3.   private $db;
  4.   // Вот и статическое свойство, которое создасться всего один раз при вызове объекта и будет хранить в себе сам объект
  5.   private static $instance;
  6.  
  7.   // конструктор сделаем приватным, что бы извне нельзя было его вызвать
  8.   private function __construct() {
  9.     try {
  10.       $this->db = new PDO('mysql:host=host;dbname=db_name;charset=utf-8', 'login', 'password');
  11.       // тут любые настройки, какие хотите
  12.       $this->db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
  13.     }catch(PDOException $e) {
  14.       // обрабатываем ошибку
  15.     }
  16.   }
  17.  
  18.   // метод для создания объекта. Здесь проверяется, если объект уже cуществует, то мы его и вернем, если не создан то создадим и вернем.
  19.   static public function  getInstance() {
  20.     if(self::$instance instanceof self) {
  21.       return self::$instance;
  22.     }
  23.     return self::$instance = new self;
  24.   }
  25. }


Для чего это всё? Для того, что бы объект не создавался больше чем один раз, независимо от того, сколько бы раз мы его не попытались создать.
т.е.
PHP:
скопировать код в буфер обмена
  1. //создаем пять раз
  2. // т.к. нам нужно вызвать статический метод, обращаемся к нему через ::
  3. $db1 = DataBase::getInstance();
  4. $db2 = DataBase::getInstance();
  5. $db3 = DataBase::getInstance();
  6. $db4 = DataBase::getInstance();
  7. $db5 = DataBase::getInstance();


Во всех $db* будет находится один и тот же объект

Если бы класс был описан как НЕ singleton, то при создании экземпляра класса, создавалось бы столько объектов, сколько раз его вызвали

PHP:
скопировать код в буфер обмена
  1. $db1 = new DataBase();
  2. $db2 = new DataBase();
  3. $db3 = new DataBase();
  4. $db4 = new DataBase();
  5. $db5 = new DataBase();

Во всех $db* свой объект

--
Теперь о статических методах
Вы решили создать какой-то класс с помощью которого вы хотите как-то очищать входящие данные. Там много всяких, разных метотодов... Улыбка мы создадим такой, но с одним методом. для примера.
Что он делает? Да ничего особенного, метод clearString удаляет все теги,пробелы в строке и возвращает обратно;
PHP:
скопировать код в буфер обмена
  1. class Validator {
  2.        
  3.   public function clearString($string) {
  4.     return trim(strip_tags($string));
  5.   }
  6. }


И вот, наступил момент, когда вам где-то понадобился этот метод. Что нужно сделать что бы он было доступен? Правильно. Создать экземпляр класса Validator и вызвать этот метод.
PHP:
скопировать код в буфер обмена
  1. //строка, в которой нужно очистить все теги
  2. $string =  'Какая-то строка, содержащая <script>alert("ололо")</script>';
  3. //создаем экземпляр класса Validator
  4. $valid = new Validator();
  5. // очищаем строку
  6. $string = $valid->clearString($string);


Что мы сделали? Создали объект ради одного метода.А ведь сам объект может нам и не понадобится никогда. Поэтому сделаем его статическим. Для того, что бы можно было воспользоваться этим методом не создавая сам объект.
Перепишем класс и объявим метод clearString статическим:
PHP:
скопировать код в буфер обмена
  1. class Validator {
  2.  
  3.   static public function clearString($string) {
  4.     return strip_tags(trim($string));
  5.   }
  6. }


И теперь, что бы очистить нашу строку :
PHP:
скопировать код в буфер обмена
  1. $string =  'Какая-то строка, содержащая <script>alert("ололо")</script>';
  2. // вызываем статический метод объекта Validator не создавая сам объект, только уже не через стрелу ->, а через ::
  3. $string = Validator::clearString($string);


Вот в общем то и всё. Может я как-то не совсем понятно объяснил, но постарался передать всё в более простой форме...
спасибо за внимание Улыбка

(Отредактировано автором: 20 Декабря, 2014 - 01:16:59)

 
My status
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Объектно-ориентированное программирование »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB