Форум программистов, компьютерный форум, киберфорум
PHP для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
310 / 206 / 44
Регистрация: 15.02.2012
Сообщений: 605

Передача всех аргументов функции дальше по цепочке

15.09.2013, 11:20. Показов 1981. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! Есть базовый класс с таким методом:
PHP
1
2
3
4
public function query()
{   
  return $this->rawQuery($this->prepareQuery(func_get_args()));
}
Работает примерно так:
PHP
1
$db->query("DELETE FROM table WHERE id=?i", $id);
Я расширяю этот класс и хочу переопределить этот метод вот так:
PHP
1
2
3
4
5
public function query()
{
  if ($condition) return parent::query();
  else return false;
}
Подскажите, как передать все параметры функции в изначальном виде внутрь метода базового класса parent::query()?
Можно конечно базовый класс отредактировать, но интересно, можно ли без этого обойтись.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
15.09.2013, 11:20
Ответы с готовыми решениями:

Передача аргументов функции
Вот такие записи, что означают, что будет происходить: function myfucnct(array $elems) function myfucnct(string $elems) function...

Передача аргументов функции
В книге Стенли Липпмана C++ Primer дошел до программы, которая выполняет замену слов в одном файле, которые указаны в другом. Например, ...

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

9
 Аватар для Vovan-VE
13210 / 6599 / 1041
Регистрация: 10.01.2008
Сообщений: 15,069
16.09.2013, 17:06
Один из косяков кривой архитектуры языка.

PHP
1
2
# PHP >= 5.3
return call_user_func_array(array("parent", __FUNCTION__), func_get_args());
А в PHP < 5.3 либо придется захардкодить имя родительского класса, что является бредом:
PHP
1
return call_user_func_array(array("Base", __FUNCTION__), func_get_args());
либо вычислять это имя в рантайме, что является еще бОльший бредом.
1
55 / 55 / 8
Регистрация: 29.08.2012
Сообщений: 175
16.09.2013, 17:23
PHP
1
$db->query("DELETE FROM table WHERE id=?i", $id);
//////////

PHP
1
2
3
4
5
6
public function query()
{
$args = func_get_args;
  if ($condition) return parent::query($args);
  else return false;
}
так не канает? Все равно ты в родительском классе передаешь массив в функцию Prepare..
В родительском классе можешь добавить:
PHP
1
2
3
4
5
6
7
8
public function query()
{ 
$args = func_get_args();
if(is_array($args[0]))
 return $this->rawQuery($this->prepareQuery($args[0]));
else
 return $this->rawQuery($this->prepareQuery($args));
}
1
310 / 206 / 44
Регистрация: 15.02.2012
Сообщений: 605
16.09.2013, 17:49  [ТС]
Vovan-VE, спасибо, работает, хотя я и не понял что это за навороты))) ... надо маны курить)

FlyMouse86, базовый класс не хочется коверкать, потом больше проблем от этих заплаток вылезет

сейчас у меня вот так:
PHP
1
2
3
4
5
public function query()
{
  if ($condition) return parent::rawQuery(parent::prepareQuery(func_get_args()));
  else return false;
}
то есть вызов идет мимо переопределенной функции (благо логики в ней - кот наплакал), но пришлось приватные методы rawQuery и prepareQuery открыть ...

теперь, возможно, заменю на то, что предложел Vovan-VE.

Спасибо за ответы!
0
 Аватар для Vovan-VE
13210 / 6599 / 1041
Регистрация: 10.01.2008
Сообщений: 15,069
16.09.2013, 17:51
Цитата Сообщение от jivot Посмотреть сообщение
надо маны курить)
http://php.net/manual/ru/langu... llable.php
1
Заблокирован
17.09.2013, 06:59
Цитата Сообщение от jivot Посмотреть сообщение
как передать все параметры функции
Так и передать - через список аргументов. Там еще раз получат список аргументов. Надо было попробовать очевидное.

ЗЫ Однако ценность такого родителя стремится к нулю. Ради чего весь сыр-бор, если все равно на каждую таблицу свой индивидуальный запрос на удаление, либо каноничная конкатенация идентификаторов до того как.
0
310 / 206 / 44
Регистрация: 15.02.2012
Сообщений: 605
17.09.2013, 09:22  [ТС]
Цитата Сообщение от sqlnub Посмотреть сообщение
Надо было попробовать очевидное
Продемонстрируйте, пожалуйста, код, реализующий подобную очевидность ...
напоминаю, функции передаётся неограниченное количество аргументов query($arg1, $arg2, ..., $argN). Ни одна из известных мне функций не сможет взять эту последовательность аргументов и передать её в другую функцию (не формируя из них массив, а передав именно последовательность).

Цитата Сообщение от sqlnub Посмотреть сообщение
Однако ценность такого родителя стремится к нулю
Класс сторонний из открытых источников. Про его ценность можете вот здесь почитать.
http://www.phpfaq.ru/safemysql
0
Заблокирован
17.09.2013, 12:07
Массив уже не аргумент?

Не важно. Я просто хотел сказать что не вижу причины расширять это убожество. Добавьте свой метод и не парьтесь.

По ссылке - все вранье. Безопасность тут вообще не стояла, про универсальность выше отметил. Ну это же элементарно:

PHP
1
$db->query("DELETE FROM table WHERE id=?i", $id);
Это ничего не значит. Значит вот что:

PHP
1
2
3
$tb = 'table';
$pk = 'id';
$db->query('DELETE FROM `'. $tb . '` WHERE  `'. $tb . '`. `' . $pk . '`=?i', $id);
Пастернака не читал, но уверен что встроенного парсера SQL в том классе нет и сам он разобраться с идентификаторами не сможет. Вам придется.

Тогда скажите на милость, зачем вам сотни классовых строк, если всем чем отличается до и после это вот что:

PHP
1
$mysqli->query('DELETE FROM `'. $tb . '` WHERE  `'. $tb . '`. `' . $pk . '`=' . $id);
Значение pk типировать? Как 2 пальца:

PHP
1
2
$id = (int) $_POST['id'];
if($id<1) die('kill yourself');
Но самая, конечно, мякотка в том, что ни один сторонник параметричеких запросов не знает где у него вообще типы полей лежат.

Добавлено через 24 минуты
Ну, то есть если $id это не число, кто поставит кавычки? Класс поставит? Он знает тип поля id?
0
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
 Аватар для KOPOJI
16844 / 6724 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
17.09.2013, 12:20
Цитата Сообщение от sqlnub Посмотреть сообщение
Ну, то есть если $id это не число, кто поставит кавычки? Класс поставит? Он знает тип поля id?
Так укажите тип поля, в чем проблема-то? И по ссылке выше видно, что там также можно указать
http://www.php.net/manual/ru/m... -param.php
http://www.php.net/manual/ru/p... dvalue.php
0
Заблокирован
17.09.2013, 14:18
Как я укажу тип поля, если я его не знаю? В консоль что ли заглянуть и в php переписать из DDL?

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

Добавлено через 2 минуты
Насчет типа еще. Класс связывает самостоятельно без всяких "препарок".

PHP
1
    $res = mysqli_query($this->conn, $query);
Все просто.

После прочтения Пастернака по диагонали только утвердился во мнении что ничего ценного там нет и проще всего добавить свой метод или покоцать имеющийся.

Добавлено через 1 час 39 минут
Кстати, вспомнил, целые значения класс пропускает как есть. Это значит санировать $id полученное из $_POST придется вручную, до того как.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
17.09.2013, 14:18
Помогаю со студенческими работами здесь

Передача аргументов функции
Как передать функции переменную неизвестного типа?

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

Функции и передача аргументов
Здравствуйте! Совсем не понимаю передачи в функции массивов и векторов.. Ну как пример. Почему так нельзя делать? И с векторами еще как...

Передача аргументов функции
Всем привет. Писал код не зная, правильно ли это. В общем застрял на составлении прототипов функции и функции мэин. И ещё, можно ли так как...

Передача аргументов функции
Здравствуйте! Есть файл-функция myfun.m: function F = myfun(s, a) for j = 1:5 F(j) = s(1) + s(2) - a(j); %...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение Это мой обзор планшета X220 с точки зрения школьника. Недавно я решила попытаться уменьшить свой. . .
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
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru