Форум программистов, компьютерный форум, киберфорум
PHP: ООП
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
17 / 17 / 8
Регистрация: 16.01.2016
Сообщений: 55
1

Запрет статического вызова или повторяющийся код в каждом методе

15.05.2017, 09:59. Показов 1696. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток. Есть некий класс, который требует для работы дополнительные данные. Например подключение модуля битрикса.
PHP
1
2
3
4
5
6
7
8
9
10
11
12
class foo
{
static function init()
{
    CModule::IncludeModule('sale');
}
 
function getSomeData()
{
    return CSaleOrder::GetList();
}
}
суть в том, что getSomeData может быть вызвана статически (php это не запрещает), но работать не будет. Точнее работать иногда будет (если модуль был подключен ранее), иногда нет. Я могу написать в каждом методе if(!$this) return false; или self::init(); но это неудобно. Собственно вопрос, можно ли физически запретить вызов foo::getSomeData() или можно ли в каждом методе автоматически исполнять некий код, не прописывая его?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.05.2017, 09:59
Ответы с готовыми решениями:

Какой код предпочтительнее в методе MainWinProc (break или return 0)
Не понятно почему в коде используют то break толи return 0; Скажите что лучше использовать? И...

Glsl - объявленная функция вызывается или код подставляется компоновщиком на место вызова?
В общем то вопрос в шапке. Волнует то, происходит реальный вызов функции в коде или же...

В методе вызова события OnClick, во время компиляции возникает ошибка
Всем привет . Подскажите, почему в методе вызова события OnClick4(), во время компиляции возникает...

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

4
313 / 312 / 221
Регистрация: 11.07.2015
Сообщений: 1,107
15.05.2017, 10:48 2
Некоторые функции, например, init, можно ограничить одним запуском:

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class foo
{
public static $conn;
static function init()
{
    CModule::IncludeModule('sale');
}
 
function getSomeData()
{
    if (is_null(self::$conn)) { 
    self::init();
    self::$conn = 1;
    }
    return CSaleOrder::GetList();
}
}
В php7 можно указать static для нужных методов, остальные не будут вызываться, но будут выдавать ошибку.

Можно импользовать ещё 1 класс, который будет распределять вызовы на статичные и обычные.
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<?php
class foo
{
public static $conn;
static function init()
{
    CModule::IncludeModule('sale');
}
 
function getSomeData()
{
    if (is_null(self::$conn)) { 
    self::init();
    self::$conn = 1;
    }
    return CSaleOrder::GetList();
}
}
 
class MethodTest {
    public function __call($name, $arguments) {
        if (in_array($name, array('getSomeData'))) {
        // метод можно запускать при объектном вызове 
        return foo::$name;
        }
    }
 
    /**  Начиная с версии PHP 5.3.0  */
    public static function __callStatic($name, $arguments) {
        if (in_array($name, array('bar'))) {
        // метод можно запускать при статическом вызове 
        return foo::$name;
        }
    }
}
?>
1
17 / 17 / 8
Регистрация: 16.01.2016
Сообщений: 55
15.05.2017, 12:34  [ТС] 3
Цитата Сообщение от plohoyav Посмотреть сообщение
В php7 можно указать static для нужных методов, остальные не будут вызываться, но будут выдавать ошибку.
это "по умолчанию" или директиву какую-то устанавливать? Вот хотелось бы аналог для php 5.x. За перегрузку спасибо, но немного не то. "Ограничить 1 запуском" - это понятно, но не хочется if (is_null(self::$conn)) или подобное писать в каждом методе.
0
313 / 312 / 221
Регистрация: 11.07.2015
Сообщений: 1,107
15.05.2017, 14:08 4
По умолчанию.

Автозагрузка классов

PHP
1
2
3
4
5
spl_autoload_register(function ($class) {
    if ($class=="CSaleOrder") {
        CModule::IncludeModule('sale');
    }
});
0
2304 / 1225 / 246
Регистрация: 16.03.2008
Сообщений: 5,840
Записей в блоге: 2
17.05.2017, 12:24 5
А по сути вопроса. А зачем такие сложности? Чем плоха конструкция (пусть хоть в каждом методе)?:
PHP
1
2
3
if (CModule::IncludeModule('sale')) {
....
}
Мне кажется подключение модуля тут совсем не причина запрещать статику. Лучше подумать в принципе для этого метода обязательно должен существовать сам объект или нет. Если объект создается только ради подключения одного модуля - как то не оправдано.... ИМХО.
0
17.05.2017, 12:24
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.05.2017, 12:24
Помогаю со студенческими работами здесь

Запрет повторного вызова OnClick
как сделать так что бы свойство OnClick выполнялось только один раз. То есть при втором нажатие оно...

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

Повторяющийся код
Есть у меня следующий код data Command ...

Повторяющийся код
Здравствуй, уважаемые форумчане! Я нуб в написании кода, поэтому прощу помощи. ближе к делу....


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru