Static vk что это такое

Здравствуйте, объясните пожалуйста новичку, что значит слово static в ООП php? В каких целях его используют и зачем?

  • Вопрос задан более трёх лет назад
  • 8224 просмотра

Комментировать
Решения вопроса 2
Full-stack developer (Symfony, Angular)

Для этого вам надо понимать в чем разница между классами и объектами. Вот есть методы и свойства объектов а есть методы и свойства классов. Последние как раз статические свойства и методы. Отсюда и все особенности их работы и возможные варианты использования. Класс у нас в системе может быть только один, а экземпляров этого класса (объектов) много.

Как правило статические методы используются в качестве порождающих. То есть вы вызываете статический метод класса а он тебе экземпляр этого класса.

$foo = Singleton::instance(); $bar = AbstractFactory::create(‘bar’); $buz = Buz::fromArray([ ‘many’ => ‘arguments’, ‘Buz’ => ‘has’, ‘private’ => ‘constructor’ ]);

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

C# статические поля класса | как работает ключевое слово static | C# ОТ НОВИЧКА К ПРОФЕССИОНАЛУ # 63

Учитывая что сейчас есть composer а благодаря opcache оверхэда от подключения для каждого запроса файла особо и нет. В целом лучше стараться избегать использования статики или во всяком случае делать в статических методах хоть сколько нибудь сложные вещи. И лучше всегда ограничиваться только случаями для порождения объектов, тут статика выглядит логично.

Если рассматривать с точки зрения пораждающиз статических методов, нам так же надо знать кого создавать. И тут появляются два ключевых слова — self и static. Причем self равносильно написанию имени класса в котором наш статический метод находится и просто позволяет уменьшить дублирование. static же намного интереснее, так как оно указывает непосдерственно на тот класс, из под которого был совершен вызов. Скажем если у вас есть наследование вы можете запихнуть порождающий метод в базовый класс, и тогда узнать кого создавать в принципе не проблема.

class Foo < public static function createWithSelf() < // равносильно new Foo(); return new self(); >public static function createWithStatic() < // а тут мы пока не знаем кто такой этот static $foo = new static(); >> class Bar extends Foo <> $foo = Bar::createWithSelf(); // тут будет экземпляр Foo $bar = Bar::createWithStatic(); // тут будет экземпляр Bar

Источник: qna.habr.com

Загадочное слово static

Одно из самых полезных ключевых слов в языке С и СPP static отвечает за распределение кода и данных в памяти.

Как следует из названия static определяет размещение кода или данных не на стеке или в куче, а именно в фиксированной области оперативной памяти static, причем расположение определяется на стадии компиляции и сборки программы.

Для лучшего понимания static смотрим сначала здесь как происходит сборка сpp файлов.

static что это. Статические поля класса. Инициализация. Ключевое слово static. C++ #92

Другими словами static гарантирует однократное размещение в оперативной памяти переменной, функции, указателя и т.д.

Когда это становится выгодно? На самом деле это очень выгодно, если ваши данные однократно определяются в памяти и более не плодятся в процессе работы программы.

Ну например структура какой-то базы данных.

Применительно к классам, static переменные необходимо инициализировать особым образом вне класса (это про файл cpp).

Еще по теме:  Как сделать качество видео в ВК лучше

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

Главная идея собрать все однократно определенные данные в static переменные/функции, обернуть это в класс (или в структуру) и пользоваться этими статическими данными из любого места программы.

Надо только подключить заголовочный файл этого класса и вуаля.

Интересное решение одной проблемы. Как известно нельзя об’явить функцию класса (Cl) одновременно виртуальной и статической. А если очень хочется? Можно поступить так: функцию (foo) об’являем виртуальной и в классе создаём ещё статический указатель (pp), который будет указывать на сам класс.

Таким образом из любого файла проекта мы можем вызвать виртуальную функцию foo следующим синтаксисом:

Cl::pp->foo();

И это сработает. Причем foo вызовется последняя в иерархии классов наследников, так как она виртуальная. То есть это может быть и класс Cl2 в иерархии наследования Cl2

Это развязывает руки программисту.

Ты можешь везде иметь доступ к виртуальной функции некоего класса через статический указатель на сам класс.

Отвлечения на тему контроллеров

Это только про язык С, не СРР. Это осталось от старых записей.

При программировании микроконтроллеров static говорит компилятору/линковщику разместить данный объект в НЕ в стеке, а в сегменте BSS (Block Started by Symbol) , это просто оперативная память выделенная для данных вашей программе, размер которых заранее известен после компиляции/сборки.

BSS это сегмент памяти RAM , который фиксируется сразу при компиляции/линковке вашей программы.

фотка 1

К тому же синтаксически static гарантирует , что объект, объявленный с клюяевым словом static в конкретном файле blabalbla.c будет использоваться только в этом файле (blabalbla.c).

Это будет только локальный объект и в других файлах *.с будет не доступен . Таким образом в других файлах можно обзывать объекты таким же именем и конфликтов не будет. Это просто удобно.

Все эти варианты надо рассматривать на практических примерах. Начнем с простейшего :

глобальная переменная вне тела функции

Тут речь про static функцию не как метод класса, а просто обычную функцию.

static int COUNT=0; void func1() < printf(«»); //int COUNT=0; printf(«%d»,COUNT ); >int main(int argc, char *argv[]) < QCoreApplication a(argc, argv); printf(«start mainn»); for (int i = 0; i < 10; i) < func1(); >printf(«nend mainn»); return a.exec(); >

Когда используем static для глобальной переменной COUNT , то COUNT попадет в .bss сегмент.
Примечание: теперь из другого файла *.c до COUNT не достучитесь теперь никак (за исключением класс::имя_статик_переменной).

Когда COUNT без static, то COUNT попадет в кучу (heap).

Примечание: Теперь из другого файла *.с можно достучаться до COUNT через директиву extern.

локальная переменная в теле функции

#include void func1() < printf(«»); static int COUNT=0; // примечательно , что присваивание 0 происходит только один раз //при инициализации программы , то есть в начале загрузки программы в память (.bss сегмент), еще до main printf(«%d»,COUNT ); >int main(int argc, char *argv[]) < QCoreApplication a(argc, argv); printf(«start mainn»); for (int i = 0; i < 10; i) < func1(); >printf(«nend mainn»); return a.exec(); >
start main 0123456789 end main

Если static не использовать в данном примере вывод будет таким:

start main 0000000000 end main

В данном варианте без static переменная COUNT создается на стеке для каждого вызова функции func1 заново (и ей присваивается 0 каждый раз заново).

Маленькая ржачка : никогда не называйте свои проекты в Qt словом static, добавьте еще хотя бы один символ.

статическая функция

#include static void func1() // < static int COUNT123=0; printf(«%d»,COUNT123 ); >int main(int argc, char *argv[]) < QCoreApplication a(argc, argv); printf(«start mainn»); for (int i = 0; i < 10; i) < func1(); >printf(«nend mainn»); return a.exec(); >

Еще по теме:  Почему в ВК не открывается документ ворд

На первый взгляд кроме того , что функцию func1 нельзя теперь вызвать из других cpp файлов вроде различий нет (что func1 со static , что без нее).

Есть большое и правильное ограничение в static функции. Это то, что в static функциях мы можем вызывать только другие static функции и присваивать значения другим только static переменным.

Но на самом деле в коде асемблерный код немного меняется. Без static так :

void func1() < 0: 6b 58 01 00 imul $0x0,0x1(%eax),%ebx 4: 02 00 add (%eax),%al static int COUNT123=0; printf(«%d»,COUNT123 ); 6: 00 00 add %al,(%eax) 6: secrel32 .debug_abbrev 8: 00 00 add %al,(%eax) a: 04 01 add $0x1,%al c: 47 inc %edi d: 4e dec %esi e: 55 push %ebp f: 20 43 2b and %al,0x2b(%ebx) 12: 2b 20 sub (%eax),%esp 14: 34 2e xor $0x2e,%al 16: 34 2e xor $0x2e,%al 18: 30 00 xor %al,(%eax) 1a: 04 2e add $0x2e,%al 1c: 2e cs 1d: 5c pop %esp 1e: 73 74 jae 94 20: 61 popa 21: 74 69 je 8c 23: 63 5f 5c arpl %bx,0x5c(%edi) >

А когда static func1 так:

static void func1() < 0: 60 pusha / / . 1: 58 pop %eax / / . 2: 01 00 add %eax,(%eax) // и далее все тоже самое 4: 02 00 add (%eax),%al static int COUNT123=0; printf(«%d»,COUNT123 ); 6: 00 00 add %al,(%eax) 6: secrel32 .debug_abbrev 8: 00 00 add %al,(%eax) a: 04 01 add $0x1,%al c: 47 inc %edi d: 4e dec %esi e: 55 push %ebp f: 20 43 2b and %al,0x2b(%ebx) 12: 2b 20 sub (%eax),%esp 14: 34 2e xor $0x2e,%al 16: 34 2e xor $0x2e,%al 18: 30 00 xor %al,(%eax) 1a: 04 2e add $0x2e,%al 1c: 2e cs 1d: 5c pop %esp 1e: 73 74 jae 94 20: 61 popa 21: 74 69 je 8c 23: 63 5f 5c arpl %bx,0x5c(%edi) >

Статик переменная в классах

С классами все намного интереснее. И это уже CPP

Допустим в классе есть статик переменная :

class class1public:
static int COUNT

Это объявление в файле class1.h .
Но этого не достаточно, в файле class1.c (или в любом другом файле *.с проекта) НАДО инициализировать статик переменную (глобально, над всеми функциями):

static int class1::COUNT=0

Если этого не будет , то проект может даже скомпилируется нормально, но когда дело дойдет непосредственно до работы с COUNT, то возникнут проблемы на этапе линковки.

В результате к переменной теперь COUNT можно обращаться из любого файла например таким образом:

И надо конечно понимать что переменная COUNT теперь всегда будет хранится в одном экземпляре , по одному адресу в оперативной памяти, не смотря на то , что самих классов class1 может быть создано несколько (но они создаются уже на стеке).

Когда статик переменные класса становятся реально необходимыми?

Есть такая функция например как
qInstallhandler

С помощью ее можно поменять обработчик событий.

В качестве параметра входит имя новой функции, которая у вас имеется (допустим назовем ее func1).

Но вот только func1 должна быть глобальной и лучше размещать ее в BSS.

А вам очень хочется , чтобы func1 была частью класса. Ведь класс удобен тем, что это кусок функционала , который удобно переносить из проекта в проект.

Класс созданный через new class1 в функции допустим func2 создается на стеке. При выходе из функции func2 класс class1 очищается.

Еще по теме:  Vk какая база данных

Источник: kkmspb.ru

Соцсеть Threads*: что это такое и почему она так популярна

ВКонтакте Яндекс Дзен Rutube Одноклассники Телеграм

Виктория Андреева

7 июл, 12:28 | Виктория Андреева Виктория Андреева Журналист Общество 83 0

Создать свою страничку здесь может любой желающий, независимо от возраста и пола. Есть ли существенные отличия от уже раскрученных площадок?

Соцсеть Threads*: что это такое и почему она так популярна

Фото: www.globallookpress.com / Karl-Josef Hildenbrand

Компания Meta** 5 июля запустила приложение Threads* для смартфонов на платформе IOS и Android. Это новая социальная сеть, похожая своим функционалом на Twitter. За сутки с момента запуска его установили боле 10 миллионов человек. Эксперты URA.RU рассказали, чем интересна Threads.

Особенности Threads

Threads работает на базе Instagram (запрещенная в РФ соцсеть; принадлежит корпорации Meta). Приложение полностью привязано к аккаунту пользователя в нем. Из новой соцсети невозможно удалиться при наличии аккаунта в Instagram. Сервисы связаны друг с другом, поэтому при регистрации в Threads новым пользователям предлагается подписаться на друзей и из Instagram.

Threads работает по принципу микроблогов в Twitter. Пользователи новой соцсети могут оставлять сообщения до 500 символов. По аналогии со своим конкурентом Threads предлагает верифицировать аккаунт, добавив «синюю галочку». Данная услуга стоит 10 долларов в месяц.

При этом в Twitter уже давно можно писать сообщения до четырех тысяч знаков. А чтобы добавить «галочку», пользователю нужно заплатить восемь долларов в месяц. Владельцы техники Apple вынуждены платить 11 долларов.

В Threads, как и любой соцсети, есть лента новостей, где отображаются материалы тех людей, на которых подписан пользователь. Также в ленте всплывают «рекомендованный контент» от других авторов. Пользователи могу сделать свой аккаунт открытым или закрытым. Кроме того, настройки приватности позволяют скрывать из ленты определенные публикации по ключевым словам.

Плюсы и минусы Threads

Из положительных моментов новой социальной сети пользователи отмечают несколько преимуществ по сравнению с Twitter. В первую очередь это отсутствие рекламы на данный момент. Также читатели обратили внимание, что комментарии под постами немного смещаются вправо, что позволяет лучше ориентироваться в ленте новостей и тредах.

Тем не менее читатели подчеркнули ряд минусов Threads. Это отсутствие возможности писать личные сообщения, нельзя вести поиск по хэштегам, а также пересылать сообщения в формате gif. При этом все эти возможности сохраняются в Twitter.

Threads против Twitter

По мнению главы информационно-аналитического агентства TelecomDaily Дениса Кускова, Threads пытается заработать очки доверия на недовольстве пользователей переменами в Twitter.

«Threads действительно пересекается с Twitter, и определенная аудитория сейчас может туда из Twitter уйти. У нового приложения есть возможность стать популярным, если ему удастся привлечь внимание пользователей какими-то фишками, которых нет в Twitter», — подчеркнул Кусков.

Портал Semafor, ссылаясь на письмо юриста Twitter Алекса Спиро, написал, что компания Twitter может подать в суд на корпорацию Meta из-за запуска конкурирующего проекта. Адвокат подчеркнул, что Meta занималась переманиванием сотрудников, который в настоящий момент имеют доступ к конфиденциальной информации, связанной с Twitter. По мнению Спиро, Threads был создан с использованием интеллектуальной собственности Twitter, а это незаконно. При этом в Meta называют эти обвинения беспочвенными.

Threads в России

Аналитик Кусков считает, что для россиян новая социальная сеть может быть не интересна в связи с тем, что ею можно пользоваться только при включенном VPN. В Роспотребнадзоре подчеркнули, что любая социальная сеть может работать в России только при соблюдении российского законодательства.

Ранее 5-tv.ru сообщал, что Илон Маск высмеял спекуляции на тему «русских ботов» в Twitter.

* — принадлежит Meta, признанной в РФ экстремистской и террористической организацией, ее деятельность запрещена на территории РФ

** — признана в РФ экстремистской и террористической организацией, ее деятельность запрещена на территории РФ

Источник: www.5-tv.ru

Рейтинг
( Пока оценок нет )
Загрузка ...