powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / [PHP] Передача неизвестного числа параметров из метода производного класса методу базового
25 сообщений из 27, страница 1 из 2
[PHP] Передача неизвестного числа параметров из метода производного класса методу базового
    #38826347
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Каким образом можно в производном классе в перегруженном методе cls2::func1() передать методу cls1::func() параметры $p1, $p2, ..., $pn , если их набор внутри класса cls2 заранее неизвестен ?

Т.е. внутри класса cls2 известно имя базового класса cls1 и имя метода cls1::func . При этом набор параметров, получаемый этим методом, неизвестен. Необходимо в производном классе вызвать метод базового класса, передав ему все полученные параметры.

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
class cls1 {
    protected function func($p1, $p2, ..., $pn) { ... }
}
class cls2 extends cls1 {
    protected function func() {
        // собственные действия
        $args = func_get_args();
        ??? // как из $args получить и передать $p1, $p2, ..., $pn ?
        return parent::func($p1, $p2, ..., $pn)
    }
}


Требования к решению:
1) Базовый класс cls1 менять нельзя. В частности, внутри базового метода cls1::func() нельзя добавлять вызов функции extract() и нельзя добавлять объявления global $p1, global $p2, ..., global $pn .
2) Нельзя использовать функцию eval()

Позволяют ли возможности php решить данную задачу ?
...
Рейтинг: 0 / 0
[PHP] Передача неизвестного числа параметров из метода производного класса методу базового
    #38826363
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: php
1.
2.
3.
4.
5.
6.
7.
function test($arg1, $arg2, $arg3 = null) {
    var_dump($arg1, $arg2, $arg3);
}
 
test(...[1, 2]);       // 1, 2
test(...[1, 2, 3]);    // 1, 2, 3
test(...[1, 2, 3, 4]); // 1, 2, 3 (remaining arg is not captured by the function declaration)
...
Рейтинг: 0 / 0
[PHP] Передача неизвестного числа параметров из метода производного класса методу базового
    #38826364
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
http://php.net/manual/ru/migration56.new-features.php
раздел Argument unpacking via ...
...
Рейтинг: 0 / 0
[PHP] Передача неизвестного числа параметров из метода производного класса методу базового
    #38826402
Фотография -k2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я наверное не в тему, а call_user_func_array?
...
Рейтинг: 0 / 0
[PHP] Передача неизвестного числа параметров из метода производного класса методу базового
    #38826638
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
то что нужно ТС, это func_get_args() - получить масив входных параметров для функции.

а то что дали ссылку на пхп 5.6

это добавка в синтаксис, что мы можем несколько задать чётко, а остальные ввиде масива.

Код: 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.
echo "<PRE>";
class A {
	public function func($a,$b)
	{
		var_dump(__CLASS__);
		var_dump(func_num_args());
		var_dump(func_get_args());
		var_dump($a);
		var_dump($b);
	}
}

class B extends A{
	public function func($a,$b,$c)
	{
		var_dump(__CLASS__);

		var_dump(func_num_args());
		var_dump(func_get_args());
		var_dump($a);
		var_dump($b);
		var_dump($c);

		parent::func($a, $b, $c, 'extra1','extra2');
	}
}

$obj = new B();

$obj->func(1,2, 3, 4);
...
Рейтинг: 0 / 0
[PHP] Передача неизвестного числа параметров из метода производного класса методу базового
    #38826930
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex564657498765453 , сабжевую задачу реализовать сможете ?
Приведите рабочий пример из 1-го поста. Напомню, что число параметров, принимаемых функцией базового класса, неизвестно.
...
Рейтинг: 0 / 0
[PHP] Передача неизвестного числа параметров из метода производного класса методу базового
    #38827188
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cyrax_02 alex564657498765453 , сабжевую задачу реализовать сможете ?
Приведите рабочий пример из 1-го поста. Напомню, что число параметров, принимаемых функцией базового класса, неизвестно.

внимательно прочитай и запусти код. А получает больше чем обьявили.
...
Рейтинг: 0 / 0
[PHP] Передача неизвестного числа параметров из метода производного класса методу базового
    #38827190
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
но вообще это какаято ересь, функция принимает разное число параметров.

у финцкии фиксированное число параметров, другое дело что параметр, может быть множеством!

func add_user_data_to_db($user_id,$very_important_value,$other_info)
{

$thosr_info - множество значений, переменное.
}
...
Рейтинг: 0 / 0
[PHP] Передача неизвестного числа параметров из метода производного класса методу базового
    #38827203
apapacy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-k2- ответил. Этож стандартный случай.
...
Рейтинг: 0 / 0
[PHP] Передача неизвестного числа параметров из метода производного класса методу базового
    #38827344
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex564657498765453то что нужно ТС, это func_get_args() - получить масив входных параметров для функции
Код: 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.
echo "<PRE>";
class A {
	public function func($a,$b)
	{
		var_dump(__CLASS__);
		var_dump(func_num_args());
		var_dump(func_get_args());
		var_dump($a);
		var_dump($b);
	}
}

class B extends A{
	public function func($a,$b,$c)
	{
		var_dump(__CLASS__);

		var_dump(func_num_args());
		var_dump(func_get_args());
		var_dump($a);
		var_dump($b);
		var_dump($c);

		parent::func($a, $b, $c, 'extra1','extra2');
	}
}

$obj = new B();

$obj->func(1,2, 3, 4);

Ага. Ошибка несоответствия деклараций:
авторE_STRICT information: Declaration of B::func() should be compatible with that of A::func()В любом случае, Ваш пример всего лишь демонстрирует возможности применения функции func_get_args , но не решает сабжевую задачу.
...
Рейтинг: 0 / 0
[PHP] Передача неизвестного числа параметров из метода производного класса методу базового
    #38827345
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторвнимательно прочитай и запусти код. А получает больше чем обьявили. Какая разница - больше получает или нет. Нам необходимо все полученные параметры (число которых внутри класса cls2 неизвестно) передать функции базового класса. Ваш пример НЕ ПЕРЕДАЁТ все полученные параметры функции базового класса. О чём речь ?

авторно вообще это какаято ересь, функция принимает разное число параметров.
у фунцкии фиксированное число параметров, другое дело что параметр, может быть множеством! Функции с переменным числом параметров - обычное явление в php. И это не ересь. А множеств в php нет. Есть массивы .
Что касается сабжевой задачи, то в объявлении функции cls1::func , конечно же, имеет место определённое число параметров (при этом php позволяет передавать и иное число параметров). Но внутри класса cls2 , повторюсь, число параметров метода cls1::func() , неизвестно.
...
Рейтинг: 0 / 0
[PHP] Передача неизвестного числа параметров из метода производного класса методу базового
    #38827391
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-k2-я наверное не в тему, а call_user_func_array?Более чем в тему. Вот такой вариант уже ближе к решению:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
class cls1 {
    public function func($p1, $p2, $p3) { return ($p1+$p2+$p3); }
}
class cls2 extends cls1 {
    public function func() {
        return call_user_func_array('parent::func', func_get_args());    
    }
}
$obj = new cls2;
echo $obj->func(1,2,3);  // получаем: 6


Но одновременно с этим, получаем предупреждение:
авторDeclaration of B::func() should be compatible with that of A::func()
Тогда как можно корректно перегрузить метод, не зная числа параметров перегружаемого метода базового класса ?
Оператор ... до php 5.6 не работает.
...
Рейтинг: 0 / 0
[PHP] Передача неизвестного числа параметров из метода производного класса методу базового
    #38827394
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В качестве костыля можно предложить такой вариант:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
class cls1 {
    public function func($p1, $p2, $p3) { return ($p1+$p2+$p3); }
}
class cls2 extends cls1 {
    // число параметров превышает возможное число параметров перегружаемого метода
    public function func($p1=0, $p2=0, $p3=0, $p4=0, $p5=0, $p6=0, $p7=0, $p8=0, $p9=0, $p10=0) {
        return call_user_func_array('parent::func', func_get_args());    
    }
}
$obj = new cls2;
echo $obj->func(1,2,3);  // получаем: 6

При этом никаких предупреждений не получим.

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

Т.е. этот вариант не катит в любом случае.
...
Рейтинг: 0 / 0
[PHP] Передача неизвестного числа параметров из метода производного класса методу базового
    #38827783
Фотография -k2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cyrax_02,

call_user_func_array(array(parent, func_name), func_get_args());
?
...
Рейтинг: 0 / 0
[PHP] Передача неизвестного числа параметров из метода производного класса методу базового
    #38827788
Фотография -k2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-k2-,
это я не дочитала до конца. просто глаз споткнулся што вызов не совсем такой
...
Рейтинг: 0 / 0
[PHP] Передача неизвестного числа параметров из метода производного класса методу базового
    #38827856
Фотография -k2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cyrax_02,

Но этот вариант не работает в тех случаях, когда перегружаемый метод базового класса имеет свои значения по умолчанию (эти значения будут "перезаписаны" значениями по умолчанию метода производного класса).
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
class cls1 {
    public function func($p1=10, $p2=20, $p3=30) { 
			return ($p1+$p2+$p3); 
		}
}
class cls2 extends cls1 {
    // число параметров превышает возможное число параметров перегружаемого метода
    public function func($p1=0, $p2=0, $p3=0, $p4=0, $p5=0, $p6=0, $p7=0, $p8=0, $p9=0, $p10=0) {
      return call_user_func_array(array(parent, "func"), func_get_args());    
    }
}
$obj = new cls2;
echo $obj->func();  //60


нет, не перезаписаны, func_get_args не возвращает значения по умолчанию

Но даже если перегружаемый метод базового класса не будет иметь значений по умолчанию, тогда будут пропущены (замаскированы) ошибки передачи параметров, когда фактически передаётся меньше параметров, чем объявлено в методе базового класса.

если вы используете динамическую передачу параметров, то конешно такие ошибки обрабатывать задача ваша, если в базовый класс вмешиваться нельзя, а нужно исследовать базовый класс из наследника, то тогда reflection
Код: php
1.
2.
3.
$base_class = new ReflectionClass('cls1');
$base_method = $base_class->getMethod('func');
$base_params = $base_method->getParameters();
...
Рейтинг: 0 / 0
[PHP] Передача неизвестного числа параметров из метода производного класса методу базового
    #38827877
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторнет, не перезаписаны, func_get_args не возвращает значения по умолчанию
Да, действительно, проверил. Умолчания не включает.
Но в любом случае, вариант с большим числом параметров - это костыль, нежели решение.

А использование reflection - вариант. Только нужно будет объявить его как static (набор параметров), чтобы набор параметров нужно было получать только один раз (reflection затратен по времени).

Всё равно надеялся на более простое и более красивое решение.
...
Рейтинг: 0 / 0
[PHP] Передача неизвестного числа параметров из метода производного класса методу базового
    #38827882
Фотография -k2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cyrax_02,

немножко задача непонятная, вы расширяете класс, о котором ничего неизвестно, кроме имени и метода?
может есть какая-то более первоначальная постановка задачи, тогда вам и посоветуют больше
...
Рейтинг: 0 / 0
[PHP] Передача неизвестного числа параметров из метода производного класса методу базового
    #38827957
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cyrax_02авторвнимательно прочитай и запусти код. А получает больше чем обьявили. Какая разница - больше получает или нет. Нам необходимо все полученные параметры (число которых внутри класса cls2 неизвестно) передать функции базового класса. Ваш пример НЕ ПЕРЕДАЁТ все полученные параметры функции базового класса. О чём речь ?

авторно вообще это какаято ересь, функция принимает разное число параметров.
у фунцкии фиксированное число параметров, другое дело что параметр, может быть множеством! Функции с переменным числом параметров - обычное явление в php. И это не ересь. А множеств в php нет. Есть массивы .
Что касается сабжевой задачи, то в объявлении функции cls1::func , конечно же, имеет место определённое число параметров (при этом php позволяет передавать и иное число параметров). Но внутри класса cls2 , повторюсь, число параметров метода cls1::func() , неизвестно.

1)яж тебе писал, твой случай как ответили - вызов функции с параметрами ввиде масива.
а код я запостил, чтобы отразить тот факт ,что вне зависимости, сколько параметров в обьявлении, мы можеш получить все параметры - обьявленные будут именнованные, отсальные только в масиве func_get_args()

2)множество - тип данных, позволяющий хранить набор из заранее определёных величин.
это определенение слова множество - как тип данных, оно сиюда ваще подходит? если мы говорим о хранение чего угодно??

множество - значит совокопность, больше чем один.

а вообще, в пхп множество как понятие есть. :) это асоциативный массив, который включает в себя все свойства множества - нет два елемента с одинаковым ключом, можно пощитать сколько элементов, можно проверить на пустоту, можно сложить вычесть, извлечь елемент, добавить елемент.

...а вообще, если мы обсуждаем ошибку в коде, то мы говорим на языке програмирования. если обсуждаем общие идеи програмирования, то говорим на языке не привязаным к конкретике програмирования...предполагая что каждый уже сам сообразит, как в своём языке реализовать/имитировать/или эмулировать общее понятие.
...
Рейтинг: 0 / 0
[PHP] Передача неизвестного числа параметров из метода производного класса методу базового
    #38827959
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторнемножко задача непонятная, вы расширяете класс, о котором ничего неизвестно, кроме имени и метода? Не совсем так. Расширяется класс некоторой сторонней программной системы . В каждый момент времени о расширяемом классе известно всё. Реализация перегрузки метода без привязки к конкретному набору параметров требуется постольку, поскольку эта самая сторонняя программная система постоянно обновляется и список параметров от версии к версии может меняться. Это универсальность, безопасность и независимость собственного кода.
...
Рейтинг: 0 / 0
[PHP] Передача неизвестного числа параметров из метода производного класса методу базового
    #38827971
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор1)яж тебе писал, твой случай как ответили - вызов функции с параметрами ввиде масива .
а код я запостил, чтобы отразить тот факт ,что вне зависимости, сколько параметров в обьявлении, мы можеш получить все параметры - обьявленные будут именнованные, отсальные только в масиве func_get_args() Чтобы вызвать функцию с параметрами в виде массива (получаемыми через func_get_args), нужно, чтобы эта самая вызываемая функция принимала параметры в виде массива, а не в виде списка. В сабжевом случае функция принимает параметры в виде списка.

автор2)множество - тип данных, позволяющий хранить набор из заранее определёных величин.
это определенение слова множество - как тип данных, оно сиюда ваще подходит? если мы говорим о хранение чего угодно??...
...а вообще, если мы обсуждаем ошибку в коде, то мы говорим на языке програмирования. если обсуждаем общие идеи програмирования, то говорим на языке не привязаным к конкретике програмирования...Вы сами себя загнали в тупик:
1) В первом предложении вы характеризуете множество как общее понятие
2) Во втором предложении говорите, что при обсуждении конкретной реализации в конкретном языке программирования следует использовать терминологию этого языка программирования
...
Рейтинг: 0 / 0
[PHP] Передача неизвестного числа параметров из метода производного класса методу базового
    #38828243
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А оператор ... в php 5.6 решает задачу ?
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
class cls1 {
    public function func($p1, $p2, $p3) { return ($p1+$p2+$p3); }
}
class cls2 extends cls1 {
    public function func(...$params) {
        return call_user_func_array('parent::func', func_get_args());    
    }
}
$obj = new cls2;
echo $obj->func(1,2,3);


Этот вариант будет работать ?
...
Рейтинг: 0 / 0
[PHP] Передача неизвестного числа параметров из метода производного класса методу базового
    #38828925
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хто-нить проверит, нет ?
Предупреждение "Declaration of B::func() should be compatible with that of A::func()"
вылезает или нет ?
...
Рейтинг: 0 / 0
[PHP] Передача неизвестного числа параметров из метода производного класса методу базового
    #38828977
Фотография -k2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cyrax_02,

у меня везде ниже 5.6 к сожалению
...
Рейтинг: 0 / 0
[PHP] Передача неизвестного числа параметров из метода производного класса методу базового
    #38829132
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А там обязательно 5.6 нужен ? Может, на 5.4 уже заработает...
В справке версию я не нашёл...
...
Рейтинг: 0 / 0
25 сообщений из 27, страница 1 из 2
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / [PHP] Передача неизвестного числа параметров из метода производного класса методу базового
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]