Форум программистов, компьютерный форум, киберфорум
PHP для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
2 / 2 / 0
Регистрация: 15.02.2022
Сообщений: 469

Static - новый функционал PHP 8

22.02.2023, 18:40. Показов 1156. Ответов 22
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Нашел этот код на просторах интернета.
Зачем создавать объект внутри класса?
В коде ниже легче было бы убрать метод generate
и просто написать $obj2 = new user()
Что дает данный подход?

Да и зачем ставить static в качестве типа
возвращаемого значения методу generate()

PHP
1
2
3
4
5
6
7
8
9
10
11
12
class user{
  
  public $name = "xopa";
 
  function generate():static{ // зачем здесь устанавливать static? что это дает?
  return new user();
  }
  
}
 
$obj = new user();
$obj2 = $obj->generate(); // не лучше ли здесь просто написать $obj2 = new user() ?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
22.02.2023, 18:40
Ответы с готовыми решениями:

Функционал buttons переключения языка на php
Сайт на английском языке. Есть база с переводом всего контента, в файле /locale/ru_RU/LC_MESSAGES/ru_RU.mo\po. Есть скрипт в index.php...

Выбор PHP фреймворка под функционал фотостока и сервиса для путешествий
Помогите пожалуйста с выбором оптимального фреймворка. Задача: создание интернет сайта с функционалом фотостока (как 500px, shutterstock)...

Новый функционал рекламы гугла
Кто знаком или сталкивался с темой: почти при любом коммерческим запросе в гугле выдаются результаты поиска и после 3-4 мест...

22
3012 / 1446 / 262
Регистрация: 16.03.2008
Сообщений: 6,447
Записей в блоге: 2
22.02.2023, 19:22
У вас тут два вопроса в одном
1 Это же упрощенное описание класса. Ситуации подобные могут быть разные: например паттерн фабрика, паттерн одиночка - причины такой необходимости могут быть разные. Это появилось раньше чем 8ка

2. static - указывает тут не совсем показательный пример у вас

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class A{
    public static function generate2(): self {
        return  new static;
    }
    public static function generate1(): static {
        return  new static;
    }
}
 
class B extends A{
    public function test():void{
 
    }
}
 
B::generate1()->test();
B::generate2()->test();
Момент тонкий, но generate1 вернет объект класса B, generate2 вернет объект класса A. Но в обоих случаях будет вызван без проблем метод test. Однако, из видимого, в настроенной IDE во втором случае ->test() будет подчеркнуто. С ошибкой "полиморфный" вызов: типа вы с объектом класса A работаете как с объектом класса B.

Соответственно при generate1 - далее в коде будут работать подсказки (т.е. IDE подскажет что есть метод test у объекта) если через generate2 - нет....

Добавлено через 1 минуту
Возможность указать тип результата static ввели недавно, и я его прям ждал.
0
132 / 76 / 16
Регистрация: 08.07.2022
Сообщений: 309
22.02.2023, 23:36
https://wiki.php.net/rfc/static_return_type

Всё обосновано ведь
1
2 / 2 / 0
Регистрация: 15.02.2022
Сообщений: 469
23.02.2023, 08:29  [ТС]
xkkx
что за пиратский сайт wiki?
где это найти на оф.сайте php.net
0
3012 / 1446 / 262
Регистрация: 16.03.2008
Сообщений: 6,447
Записей в блоге: 2
23.02.2023, 08:33
Цитата Сообщение от G_manX Посмотреть сообщение
что за пиратский сайт wiki?
где это найти на оф.сайте php.net
Какой пиратский сайт?
У вас реально каша в голове.

Вам дали ссылку на официальный сайт. Конкретно на RFC посвященное данному вопросу.

В конце даже есть таблица с голосованием, где показано кто как проголосовал за введение в язык этого предложения.
1
2 / 2 / 0
Регистрация: 15.02.2022
Сообщений: 469
23.02.2023, 08:47  [ТС]
voral
Если использовать static generate1, что все методы и свойства класса B будут статическими?


new static в generate1():static, значит создать объект класса в котором находится сам метод generate1()?
а в generate2():self то же самое, но он не создаст объект текущего класса, если его унаследовать?
Получается, что static как тип return это улучшенная версия self?

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class A{
    public static function generate2(): self {
        return  new static;
    }
    public static function generate1(): static {
        return  new static;
    }
}
 
class B extends A{
   
    public $name ="статическое свойство <br>";
 
 
    public function test():void{
    echo "статический метод";
    }
}
 
 
echo B::generate1()->name;
echo B::generate1()->test();
Добавлено через 3 минуты
voral
Вам дали ссылку на официальный сайт. Конкретно на RFC посвященное данному вопросу.
ну там перед php.net стоит wiki, я и подумал, что это сайт c вирусом.
да и дизайн отличается от обычного оф.сайта.
обычно оф. сайт просто пишется php.net без поддоменов вначале.
0
3012 / 1446 / 262
Регистрация: 16.03.2008
Сообщений: 6,447
Записей в блоге: 2
23.02.2023, 08:49
Цитата Сообщение от G_manX Посмотреть сообщение
Если использовать static generate1, что все методы и свойства класса B будут статическими?
1. Нет.
2. В обоих вариантах будет создан объект класса B

Цитата Сообщение от G_manX Посмотреть сообщение
Получается, что static это улучшенная версия self?
Нет. Это разные вещи.

Почитайте статью по ссылке

PS. Судя по вашим прочим вопросам, вам бы сначала с более базовыми вопросами разобраться. От того, что вы болтаетесь по темам ни чего хорошего не выйдет. Это уже видно по вчерашним вашим вопросам. (как пример про функции)
0
132 / 76 / 16
Регистрация: 08.07.2022
Сообщений: 309
23.02.2023, 08:50
Цитата Сообщение от G_manX Посмотреть сообщение
что все методы и свойства класса B будут статическими?
Нет.

Цитата Сообщение от G_manX Посмотреть сообщение
Получается, что static как тип return это улучшенная версия self?
When considering just class B, replacing a self type with a static type results in identical behavior. However, the return value of C::test() is further restricted relative to a self type. For this reason static is considered a subtype of self.
0
Эксперт PHP
 Аватар для liris
4357 / 1000 / 150
Регистрация: 16.01.2023
Сообщений: 2,465
23.02.2023, 08:53
Цитата Сообщение от G_manX Посмотреть сообщение
ну там перед php.net стоит wiki
Поддомены всегда принадлежат домену. Вы путаете с более высокоуровневыми доменами.
На пиратский сайт было бы похоже например так:

php.wiki.tk
0
2 / 2 / 0
Регистрация: 15.02.2022
Сообщений: 469
23.02.2023, 09:08  [ТС]
voral
В обоих вариантах будет создан объект класса B
Вы же сами сказали, что:
Момент тонкий, но generate1 вернет объект класса B, generate2 вернет объект класса A.
PHP
1
2
B::generate1()->test(); // создает объект в котором находится метод "generate1"
B::generate2()->test(); // создает объект родительского класса "A"
Добавлено через 2 минуты
liris
RFC в php.net это контент, которые создали сами пользователи?
поэтому раздел и называется RFC?

Добавлено через 2 минуты
xkkx
1. Нет.
Если нет, тогда почему, я вызываю это как статическое свойство?
B::generate1()->name;

Добавлено через 5 минут
Да и в доке на которую дали ссылку написано, что static это расширенная версия self.
0
Эксперт PHP
 Аватар для liris
4357 / 1000 / 150
Регистрация: 16.01.2023
Сообщений: 2,465
23.02.2023, 09:16
Цитата Сообщение от G_manX Посмотреть сообщение
liris
RFC в php.net это контент, которые создали сами пользователи?
поэтому раздел и называется RFC?
Откройте гугл (или яндекс), и напишите в нем "что такое RFC?" (без кавычек).
По первой же ссылке скорее всего выйдет википедия, где будет подробно написано что это такое, краткий экскурс в историю, и ссылки где можно почитать подробнее.

Сходите. Почитайте. Вернетесь, зададите вопрос что было непонятно в написанном. Ок?

Добавлено через 6 минут
Цитата Сообщение от liris Посмотреть сообщение
Откройте гугл
Я поясню. Каждый раз, когда вы спрашиваете кого-то на форуме, или в жизни то, что вы можете прочитать самостоятельно - кроме того, что вы тратите впустую и свое время, и время того, кого спрашиваете, вы еще и приобретаете плохую привычку, называемую "несамостоятельность".

Чем дольше вы практикуете этот подход, тем медленее вы эволюционируете.
0
132 / 76 / 16
Регистрация: 08.07.2022
Сообщений: 309
23.02.2023, 09:19
Цитата Сообщение от G_manX Посмотреть сообщение
Если нет, тогда почему, я вызываю это как статическое свойство?
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$newB = new B;
 
$newB_selfNewB =  $newB->generate2();
$newB_staticNewB =  $newB->generate1();
 
$selfNewB =  B::generate2();
$staticNewB =  B::generate1();
 
var_dump($newB_selfNewB == $selfNewB);
var_dump($newB_staticNewB == $staticNewB);
 
var_dump($newB);
var_dump($selfNewB);
var_dump($newB == $selfNewB);
var_dump($staticNewB);
var_dump($staticNewB == $selfNewB);
 
$newB->test(); 
$selfNewB->test();
$staticNewB->test();
0
2 / 2 / 0
Регистрация: 15.02.2022
Сообщений: 469
23.02.2023, 09:39  [ТС]
liris
Я читал про RFC прежде чем задавать вам вопрос.
Там сказано, что это документация содержащая технические стандарты.
Допустим есть, https://www.php.net/manual/ru/... itance.php
Где тоже содержится документация про php, но здесь в ссылке нет RFC

И https://wiki.php.net/rfc/static_return_type
где в ссылке написано rfc, здесь тоже документация про php.
Вот я и задал вопрос, rfc это раздел для пользователей,
которые создают свои темы про php, а потом создатели php смотрят и одобряют эти темы,
а затем публикуют в разделе RFC, верно ли?

Добавлено через 8 минут

xkkx

вышел:
bool(true) bool(true) object(B)#1 (1) { ["name"]=> string(4) "xopa" } object(B)#4 (1) { ["name"]=> string(4) "xopa" } bool(true) object(B)#5 (1) { ["name"]=> string(4) "xopa" } bool(true)
Ну создали 5 объектов, а дальше ничего не понял.
0
132 / 76 / 16
Регистрация: 08.07.2022
Сообщений: 309
23.02.2023, 09:39
Цитата Сообщение от G_manX Посмотреть сообщение
создают свои темы про php
Типа того, так что скорее создавай аккаунт по ссылке
https://wiki.php.net/start?do=register

И вперёд, учить разработчиков как надо делать язык
0
132 / 76 / 16
Регистрация: 08.07.2022
Сообщений: 309
23.02.2023, 09:44
Цитата Сообщение от G_manX Посмотреть сообщение
Ну создали 5 объектов, а дальше ничего не понял.
Если бы ты внимательно читал, то понял бы. Что возвращаемый тип self может принять как new static так и new self. А вот возвращаемый тип static может принять только static.

Это и есть ответ на всё. Дело в возвращаемом типе.
0
2 / 2 / 0
Регистрация: 15.02.2022
Сообщений: 469
23.02.2023, 09:50  [ТС]
xkkx
Это без сарказма)?
Типа того
А это, как я понимаю уже с сарказмом)?
так что скорее создавай аккаунт по ссылке
И вперёд, учить разработчиков как надо делать язык
0
3012 / 1446 / 262
Регистрация: 16.03.2008
Сообщений: 6,447
Записей в блоге: 2
23.02.2023, 10:24
Цитата Сообщение от G_manX Посмотреть сообщение
Вы же сами сказали, что:
Момент тонкий,
Объект класса B так же является и объектом класса A. У нас же наследование.

тут некая декларация правил. В одном случае гарантировано возвращается объект класса A в другом гарантировано возвращается объект класса наследника.

Добавлено через 1 минуту
Цитата Сообщение от G_manX Посмотреть сообщение
поэтому раздел и называется RFC?
Какой смысл вам отвечать, если вы не читаете. Я же дал ссылку что такое RFC (хотя, если вы собираетесь стать программистом, вы сами должны уметь найти ответ на этот вопрос очень легко)

Добавлено через 3 минуты
Цитата Сообщение от G_manX Посмотреть сообщение
Там сказано, что это документация содержащая технические стандарты.
В первую очередь там сказано , что это "рабочее предложение".... На основе этих предложений развивается язык.

Добавлено через 13 минут
Цитата Сообщение от G_manX Посмотреть сообщение
Если нет, тогда почему, я вызываю это как статическое свойство?
B::generate1()->name;
С чего вы взяли, что оно статическое? Оно таковым не является.
0
2 / 2 / 0
Регистрация: 15.02.2022
Сообщений: 469
23.02.2023, 15:49  [ТС]
voral,

На основе этих предложений развивается язык.
Rfc это раздел для пользователей,
которые создают свои темы про php,
а потом создатели php смотрят и одобряют эти темы,
а затем публикуют в разделе RFC.
А вы говорите, что я не так понял про rfc.

Добавлено через 4 минуты
voral,

А что тогда здесь происходит?
PHP
1
B::generate1()->name;
Это все равно, что:
PHP
1
2
$obj = new B();
$obj->name;
Только в первом случае это все происходит через статический метод "посредник" generate1()?
Другими словами первый случай дает нам определенную гибкость при наследовании?
0
3012 / 1446 / 262
Регистрация: 16.03.2008
Сообщений: 6,447
Записей в блоге: 2
23.02.2023, 16:02
Лучший ответ Сообщение было отмечено G_manX как решение

Решение

Цитата Сообщение от G_manX Посмотреть сообщение
Rfc это раздел для пользователей,
которые создают свои темы про php,
а потом создатели php смотрят и одобряют эти темы,
а затем публикуют в разделе RFC.
Не совсем так. Почитайте вот эту статью

Цитата Сообщение от G_manX Посмотреть сообщение
А что тогда здесь происходит?
Обращаетесь к свойству объекта класса B (НЕ статическому)

Цитата Сообщение от G_manX Посмотреть сообщение
Только в первом случае это все происходит через статический метод "посредник"?
Нет. В обоих случаях исключительно обращение к объекту класса B. Для полной идентичности должно быть так
PHP
1
2
B::generate1()->name;
(new  B())->name;
или
PHP
1
2
3
4
$obj = B::generate1();
$obj->name;
$obj = new  B());
$obj->name;
Цитата Сообщение от G_manX Посмотреть сообщение
Другими словами первый случай дает нам определенную гибкость при наследовании?
От части да, но это не главное. Примеры, которые вы рассматриваете, вообще ни к месту. в свете поставленного изначально вопроса. Т.к. работа со свойством абсолютно одинаковая
1
2 / 2 / 0
Регистрация: 15.02.2022
Сообщений: 469
23.02.2023, 16:12  [ТС]
voral
Ясно, а почему вы ранее говорили, что всю жизнь ждали, когда выйдет static как return?
Потому что при помощи return new static, можно создавать объект класса, в котором находится сам метод, даже если он унаследован?
И чтобы картина была полной, нужно еще добавить тип возвращаемого значения "static"
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
23.02.2023, 16:12
Помогаю со студенческими работами здесь

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

Узнать, как сильно повлияет на нагрузку сервера новый функционал
Ребят, всем привет! Есть такой вопрос, касающееся того, как узнать, как повлияет новый функционал на нагрузку сервера, если на странице...

Функционал страницы PHP
Всем привет, проблема в том что не работает кнопка Изменить, ну как не работает, при нажатии перекидывает на страницу 404... Сколько не...

Static WM_SETTEXT новый текст накладывается на предыдущий
SendMessage(hWndStatic, WM_SETTEXT, 0, (LPARAM)&quot;Test&quot;); Если предыдущий текст был длиннее чем новый, то видно слияние двух текстов, как...

Прикрепить функционал php к html верстке
Доброго времени суток всем. У меня есть уже написанный функционал на php: вход, личный кабинет, регистрация; работает с бд. Дали верстку на...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru