Аватар для Fatmarmelad
34 / 10 / 2
Регистрация: 20.02.2016
Сообщений: 1,614

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

07.05.2022, 13:22. Показов 1467. Ответов 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
3060 / 1460 / 265
Регистрация: 16.03.2008
Сообщений: 6,500
Записей в блоге: 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
3060 / 1460 / 265
Регистрация: 16.03.2008
Сообщений: 6,500
Записей в блоге: 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
3060 / 1460 / 265
Регистрация: 16.03.2008
Сообщений: 6,500
Записей в блоге: 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,614
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
3060 / 1460 / 265
Регистрация: 16.03.2008
Сообщений: 6,500
Записей в блоге: 2
09.05.2022, 13:39
Fatmarmelad, выводится этот варнинг или нет не особо важно

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

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

Добавлено через 2 минуты
Ради интереса глянул... статические методы появились в php 5.0 ( 2004 год)
1
 Аватар для Fatmarmelad
34 / 10 / 2
Регистрация: 20.02.2016
Сообщений: 1,614
09.05.2022, 13:42  [ТС]
Какой выход в подобных ситуациях? дописывать слово static в определении метода?
0
3060 / 1460 / 265
Регистрация: 16.03.2008
Сообщений: 6,500
Записей в блоге: 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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определённом условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru