Форум программистов, компьютерный форум, киберфорум
PHP: ООП
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
 Аватар для Fatmarmelad
34 / 10 / 2
Регистрация: 20.02.2016
Сообщений: 1,613

Почему вызов функции Deprecated?

07.05.2022, 13:22. Показов 1353. Ответов 19
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!
рассматриваю код, с такими моментами, на которые выводится deprecated

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Model{}
 
abstract class DbModel extends Model
{
abstract public function findUser();
}
 
class User extends DbModel{}
 
class loginUser extends class Model{
  public function login(){
                $user = User::findUser(); //  предупреждение выбивает в этой строке. 
    }
}
Deprecated: Non-static method app\core\DbModel::findUser() should not be called statically
Это ошибка в коде или такой способ записи реально устаревший?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
07.05.2022, 13:22
Ответы с готовыми решениями:

Почему вызов функции выведет 0?
Объясните, пожалуйста. Есть такая функция: function test(){ $a = 0; echo $a++; } test(); // 0

Ошибка Deprecated: mysql_connect(): The mysql extension is deprecated and will be removed in the future
Пытаюсь создать сайт: Но при создании магаза открывается ошибка: Deprecated: mysql_connect(): The mysql extension is deprecated and will...

Deprecated: mysql_connect(): The mysql extension is deprecated and will be removed in the future: use mysqli o
Здравствуйте! Сделал пример http://devcolibri.com/1486 со сборкой денвер сделал все в порядке, работает) дальше решил сделать свою...

19
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
07.05.2022, 16:28
Цитата Сообщение от Fatmarmelad Посмотреть сообщение
такой способ записи реально устаревший?
Да. Такой способ в принципе нелогичен (вдруг findUser использует $this, которой нет при статичном вызове), не знаю, зачем когда-то допускали его использование.
0
321 / 189 / 78
Регистрация: 04.10.2016
Сообщений: 809
08.05.2022, 13:25
Цитата Сообщение от Fatmarmelad Посмотреть сообщение
рассматриваю код
у вас в коде ошибки. приведи код в рабочее состояние.


Цитата Сообщение от Fatmarmelad Посмотреть сообщение
PHP
1
2
3
4
5
    ...
    public function login(){
        $user = User::findUser(); //  предупреждение выбивает в этой строке. 
    }
    ...
Цитата Сообщение от Fatmarmelad Посмотреть сообщение
способ записи реально устаревший?
Цитата Сообщение от Para bellum Посмотреть сообщение
Да
вплоть до версии 8.1.5 - работает и не является устаревшим.
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
08.05.2022, 13:43
Цитата Сообщение от Fart83 Посмотреть сообщение
вплоть до версии 8.1.5 - работает и не является устаревшим.
https://onlinephp.io/c/b177b
0
321 / 189 / 78
Регистрация: 04.10.2016
Сообщений: 809
08.05.2022, 13:46
Цитата Сообщение от Jewbacabra Посмотреть сообщение
https://onlinephp.io/c/b177b
https://onlinephp.io/c/bfd84
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
08.05.2022, 13:50
Цитата Сообщение от Fart83 Посмотреть сообщение
https://onlinephp.io/c/bfd84
Вызов метода родителя (не обязательно прямого) и вызов нестатического метода как статического - разные вещи, несмотря на похожий синтаксис.
0
321 / 189 / 78
Регистрация: 04.10.2016
Сообщений: 809
08.05.2022, 13:53
Цитата Сообщение от Jewbacabra Посмотреть сообщение
Вызов метода родителя (не обязательно прямого) и вызов нестатического метода как статического - разные вещи, несмотря но похожий синтаксис.
вы пример ТС смотрели? я думаю, что нет

Добавлено через 1 минуту
Цитата Сообщение от Jewbacabra Посмотреть сообщение
разные вещи
это когда вы показываете другой пример... и пытаетесь изменить тематику ТС
0
3012 / 1446 / 262
Регистрация: 16.03.2008
Сообщений: 6,447
Записей в блоге: 2
08.05.2022, 13:54
Цитата Сообщение от Fart83 Посмотреть сообщение
вплоть до версии 8.1.5 - работает и не является устаревшим.
То что работает не отменяет того, что такое поведение не объявлено depricated. Рано или поздно это будет вызывать ошибку.
Собственно это абсолютно правильно. Метод НЕ объявлен статическим в абстрактном классе. Абстрактный класс по сути задает "соглашение" и правила.

Тут правильнее говорить не "устаревший"/"не устаревший". А о том, что "плохой код"/"правильный код". В данном конкретном случае надо понимать, что допустимое (согласно соглашения накладываемого классом DbModel) изменение класса User может вызвать "поломку" кода в совершенно другом месте/местах.


Если это не устраивает необходимо создавать новый абстрактный класс (или интерфейс) вместо DbModel. который будет описывать соглашение о существовании статического метода
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
08.05.2022, 13:55
Цитата Сообщение от Fart83 Посмотреть сообщение
вы пример ТС смотрели? я думаю, что нет
Как раз смотрел. И там именно что попытка вызвать нестатический метод как статический.
0
321 / 189 / 78
Регистрация: 04.10.2016
Сообщений: 809
08.05.2022, 13:55
Цитата Сообщение от voral Посмотреть сообщение
Тут правильнее говорить не "устаревший"/"не устаревший".
Цитата Сообщение от Fatmarmelad Посмотреть сообщение
Deprecated
вас не смущает это слово и приведенный пример?
0
3012 / 1446 / 262
Регистрация: 16.03.2008
Сообщений: 6,447
Записей в блоге: 2
08.05.2022, 13:56
Цитата Сообщение от Fart83 Посмотреть сообщение
вас не смущает это слово?
"Осуждаемый" ? нет
Оно как раз и говорит о том, что я пояснил
0
321 / 189 / 78
Регистрация: 04.10.2016
Сообщений: 809
08.05.2022, 13:56
Цитата Сообщение от Jewbacabra Посмотреть сообщение
Как раз смотрел.
и ошибки в коде... тоже видели? не смутило вас?
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
08.05.2022, 14:01
Цитата Сообщение от Fart83 Посмотреть сообщение
тоже видели? не смутило вас?
А что конкретно и почему меня должно смутить? Код явно не полный, поэтому отсутствие реализации абстрактных методов пропускаем. Лишнее ключевое слово class однозначно исправляется. Иерархия классов понятна.
1
3012 / 1446 / 262
Регистрация: 16.03.2008
Сообщений: 6,447
Записей в блоге: 2
08.05.2022, 14:03
Цитата Сообщение от Jewbacabra Посмотреть сообщение
А что конкретно и почему меня должно смутить? Код явно не полный, поэтому отсутствие реализации абстрактных методов пропускаем. Лишнее ключевое слово class однозначно исправляется. Иерархия классов понятна.
Добавлю, что как конкретно реализован класс User тут вообще не важно
0
321 / 189 / 78
Регистрация: 04.10.2016
Сообщений: 809
08.05.2022, 14:08
Цитата Сообщение от Jewbacabra Посмотреть сообщение
Код явно не полный
как и ваш пример

Цитата Сообщение от Jewbacabra Посмотреть сообщение
Лишнее ключевое слово class однозначно исправляется
Parse error: syntax error, unexpected token "class" ...

Цитата Сообщение от Jewbacabra Посмотреть сообщение
Иерархия классов понятна.
приму это как за аргумент
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
08.05.2022, 14:14
Цитата Сообщение от Fart83 Посмотреть сообщение
как и ваш пример
Мой код полный, и выполнимый (кроме 8.1, где такой вызов падает с ошибкой)
Цитата Сообщение от Fart83 Посмотреть сообщение
Parse error: syntax error, unexpected token "class"
Так я и пишу, что однозначно (удалением class) исправляется. Но так как код не полный, все равно не будет работать, но чтобы понять иерархию классов это и не нужно.
0
 Аватар для Fatmarmelad
34 / 10 / 2
Регистрация: 20.02.2016
Сообщений: 1,613
09.05.2022, 13:33  [ТС]
Цитата Сообщение от Jewbacabra Посмотреть сообщение
https://onlinephp.io/c/b177b
Result for 7.0.33:
Deprecated: Non-static method A::a1() should not be called statically in /home/user/scripts/code.php on line 6
0
3012 / 1446 / 262
Регистрация: 16.03.2008
Сообщений: 6,447
Записей в блоге: 2
09.05.2022, 13:39
Fatmarmelad, выводится этот варнинг или нет не особо важно

Такое написание объективно можно было считать "depricated" с той самой версии php когда там появились классы, статические и не статические методы.

И, на конец то, уже сам язык начинает приучать писать код правильно

Добавлено через 2 минуты
Ради интереса глянул... статические методы появились в php 5.0 ( 2004 год)
1
 Аватар для Fatmarmelad
34 / 10 / 2
Регистрация: 20.02.2016
Сообщений: 1,613
09.05.2022, 13:42  [ТС]
Какой выход в подобных ситуациях? дописывать слово static в определении метода?
0
3012 / 1446 / 262
Регистрация: 16.03.2008
Сообщений: 6,447
Записей в блоге: 2
09.05.2022, 13:54
Тут зависит от проекта.

Но в общем случае, (если иметь в виду хорошие практики) То нужно создавать отдельную версию класса DbModel в которой этот метод будет статическим. Если в этом классе есть еще какие то методы, которые не изменятся, то их выделить в более "старший" класс. И оба эти класса (DBModel и новый) унаследовать от него.

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

Если DBModel это класс сторонних разработчиков, а loginUser - уже ваш класс. Тут только через создание объекта
PHP
1
(new User())->findUser();
Если это проект сугубо ваш, можно принять решение о рефакторинге. Ищите все вхождения, покрываете тестами. И рефакторите, добавив static в DbModel

Но при рефакторинге тут вообще можно копнуть и глубже, судя по названиям. У вас User это и отдельная сущность, и в тоже время осуществляет поиск пользователей. Т.е. есть подозрение на смешение "уровней" архитектуры. Но это тема уже отдельная
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
09.05.2022, 13:54
Помогаю со студенческими работами здесь

Deprecated: Function mysql_list_tables() is deprecated in Z:\home\localhost\www\list_tables.php on line 15
Выдает вот такой текст перед списком таблиц. Deprecated: Function mysql_list_tables() is deprecated in ...

Deprecated: Function ereg() is deprecated in /home/u384616119/public_html/smile.php on line 15
{ if (ereg(".gif$", "$file")) {$a=$file;}} closedir ($dir); sort($a); -------- Помогите,плиз

Скрипт выдает ошибку: Deprecated: Function ereg() is deprecated
Вот я хотел установить почтовый дятел и Мой скрип выдает такие ошибки: Deprecated: Function ereg() is deprecated in...

Deprecated: mysql_connect(): The mysql extension is deprecated
Не могу понять почему не работает код: <?php $db_server = mysql_connect('localhost', 'mouse', 'pass'); if (!$db_server)...

Deprecated: Assigning the return value of new by reference is deprecated
Как убрать, в глобальных настройках 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