Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / [PHP] Передача неизвестного числа параметров из метода производного класса методу базового / 25 сообщений из 27, страница 1 из 2
05.12.2014, 15:32
    #38826347
Cyrax_02
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[PHP] Передача неизвестного числа параметров из метода производного класса методу базового
Каким образом можно в производном классе в перегруженном методе 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
05.12.2014, 15:40
    #38826363
ScareCrow
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[PHP] Передача неизвестного числа параметров из метода производного класса методу базового
Код: 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
05.12.2014, 15:41
    #38826364
ScareCrow
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[PHP] Передача неизвестного числа параметров из метода производного класса методу базового
http://php.net/manual/ru/migration56.new-features.php
раздел Argument unpacking via ...
...
Рейтинг: 0 / 0
05.12.2014, 16:05
    #38826402
-k2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[PHP] Передача неизвестного числа параметров из метода производного класса методу базового
я наверное не в тему, а call_user_func_array?
...
Рейтинг: 0 / 0
05.12.2014, 19:48
    #38826638
alex564657498765453
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[PHP] Передача неизвестного числа параметров из метода производного класса методу базового
то что нужно ТС, это 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
06.12.2014, 12:14
    #38826930
Cyrax_02
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[PHP] Передача неизвестного числа параметров из метода производного класса методу базового
alex564657498765453 , сабжевую задачу реализовать сможете ?
Приведите рабочий пример из 1-го поста. Напомню, что число параметров, принимаемых функцией базового класса, неизвестно.
...
Рейтинг: 0 / 0
07.12.2014, 00:20
    #38827188
alex564657498765453
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[PHP] Передача неизвестного числа параметров из метода производного класса методу базового
Cyrax_02 alex564657498765453 , сабжевую задачу реализовать сможете ?
Приведите рабочий пример из 1-го поста. Напомню, что число параметров, принимаемых функцией базового класса, неизвестно.

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

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

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

$thosr_info - множество значений, переменное.
}
...
Рейтинг: 0 / 0
07.12.2014, 01:09
    #38827203
apapacy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[PHP] Передача неизвестного числа параметров из метода производного класса методу базового
-k2- ответил. Этож стандартный случай.
...
Рейтинг: 0 / 0
07.12.2014, 15:17
    #38827344
Cyrax_02
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[PHP] Передача неизвестного числа параметров из метода производного класса методу базового
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
07.12.2014, 15:18
    #38827345
Cyrax_02
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[PHP] Передача неизвестного числа параметров из метода производного класса методу базового
авторвнимательно прочитай и запусти код. А получает больше чем обьявили. Какая разница - больше получает или нет. Нам необходимо все полученные параметры (число которых внутри класса cls2 неизвестно) передать функции базового класса. Ваш пример НЕ ПЕРЕДАЁТ все полученные параметры функции базового класса. О чём речь ?

авторно вообще это какаято ересь, функция принимает разное число параметров.
у фунцкии фиксированное число параметров, другое дело что параметр, может быть множеством! Функции с переменным числом параметров - обычное явление в php. И это не ересь. А множеств в php нет. Есть массивы .
Что касается сабжевой задачи, то в объявлении функции cls1::func , конечно же, имеет место определённое число параметров (при этом php позволяет передавать и иное число параметров). Но внутри класса cls2 , повторюсь, число параметров метода cls1::func() , неизвестно.
...
Рейтинг: 0 / 0
07.12.2014, 16:22
    #38827391
Cyrax_02
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[PHP] Передача неизвестного числа параметров из метода производного класса методу базового
-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
07.12.2014, 16:32
    #38827394
Cyrax_02
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[PHP] Передача неизвестного числа параметров из метода производного класса методу базового
В качестве костыля можно предложить такой вариант:
Код: 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
08.12.2014, 11:03
    #38827783
-k2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[PHP] Передача неизвестного числа параметров из метода производного класса методу базового
Cyrax_02,

call_user_func_array(array(parent, func_name), func_get_args());
?
...
Рейтинг: 0 / 0
08.12.2014, 11:06
    #38827788
-k2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[PHP] Передача неизвестного числа параметров из метода производного класса методу базового
-k2-,
это я не дочитала до конца. просто глаз споткнулся што вызов не совсем такой
...
Рейтинг: 0 / 0
08.12.2014, 11:53
    #38827856
-k2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[PHP] Передача неизвестного числа параметров из метода производного класса методу базового
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
08.12.2014, 12:14
    #38827877
Cyrax_02
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[PHP] Передача неизвестного числа параметров из метода производного класса методу базового
авторнет, не перезаписаны, func_get_args не возвращает значения по умолчанию
Да, действительно, проверил. Умолчания не включает.
Но в любом случае, вариант с большим числом параметров - это костыль, нежели решение.

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

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

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

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

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

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

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

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

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

автор2)множество - тип данных, позволяющий хранить набор из заранее определёных величин.
это определенение слова множество - как тип данных, оно сиюда ваще подходит? если мы говорим о хранение чего угодно??...
...а вообще, если мы обсуждаем ошибку в коде, то мы говорим на языке програмирования. если обсуждаем общие идеи програмирования, то говорим на языке не привязаным к конкретике програмирования...Вы сами себя загнали в тупик:
1) В первом предложении вы характеризуете множество как общее понятие
2) Во втором предложении говорите, что при обсуждении конкретной реализации в конкретном языке программирования следует использовать терминологию этого языка программирования
...
Рейтинг: 0 / 0
08.12.2014, 16:47
    #38828243
Cyrax_02
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[PHP] Передача неизвестного числа параметров из метода производного класса методу базового
А оператор ... в 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
09.12.2014, 13:43
    #38828925
Cyrax_02
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[PHP] Передача неизвестного числа параметров из метода производного класса методу базового
Хто-нить проверит, нет ?
Предупреждение "Declaration of B::func() should be compatible with that of A::func()"
вылезает или нет ?
...
Рейтинг: 0 / 0
09.12.2014, 14:14
    #38828977
-k2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[PHP] Передача неизвестного числа параметров из метода производного класса методу базового
Cyrax_02,

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


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