[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: НЕ срабатывает метод __call()
romantik2011
Попробовал написать такой код, не выводит все три параметра почему-то. Я имею ввиду, второго перегруженного метода с именем m().

<?php
class
D{
function m($p1,$p2){
for($i=0; $i<count($p1); $i++)
echo $p1[$i].' ';
echo ' '.$p2;
}
function __call($n,$v) {
foreach($v as $z=>$f){
echo $v. ' '.$f;
}
}


}

$x = new D;
$p = array("Динозавр","Аладин",954);
$g = array("Ура!");

$x->m($p,"2-ой параметр<br />");
$x->m($g,"Санчо","3-ий параметр<br />");

?>





Спустя 18 минут, 24 секунды (3.08.2011 - 19:43) jetistyum написал(а):
А должен выводить?

Спустя 3 минуты, 39 секунд (3.08.2011 - 19:47) romantik2011 написал(а):
Да, точно, он вызывается когда какой-то метод не определн.
Ясно, но почему-то цикл фор-ич не подставил значения.
Я изменил вот эту строку:
$x->m($g,"Санчо","3-ий параметр");

на эту
$x->s($g,"Санчо","3-ий параметр");


Получил такой результат:
Цитата
Динозавр Аладин 954 2-ой параметр
Array ArrayArray СанчоArray 3-ий параметр

Почему форич значения не подстаивл, а вывалил всё Array вместо значений?

Спустя 10 минут, 41 секунда (3.08.2011 - 19:57) neadekvat написал(а):
Товарищь, вы, пардон, уверены, что вам нужно заниматься ООП? На элементарных вещах летите. Проходишь foreach по циклу $v и его же выводишь в этом же цикле - чего ты ожидаешь овидеть?

Спустя 2 минуты, 50 секунд (3.08.2011 - 20:00) jetistyum написал(а):
ты в метод __call передаешь 3 параметра
1. массив,
2. строка
3. строка

но в самом методе принимаешь 1. название метода, 2. параметры вызова массивом. (Ты конечно же прочитал про это, прежде чем пытаться написать) ну а дальше думай почему так получилось


Спустя 46 минут, 19 секунд (3.08.2011 - 20:46) romantik2011 написал(а):
Ну так метод __call больше двух параметров не принимает.

Спустя 19 минут, 50 секунд (3.08.2011 - 21:06) jetistyum написал(а):
ну так и не должен, читай документацию

Спустя 17 минут, 28 секунд (3.08.2011 - 21:24) romantik2011 написал(а):
Работает только так:


<?php
class
D{
function m($p1,$p2){
for($i=0; $i<count($p1); $i++)
echo $p1[$i].' ';
echo ' '.$p2;
}
function __call($n,$v) {
foreach($v as $f){
foreach($f as $v)
echo $v.' ';
}
}


}

$x = new D;
$p = array("Динозавр","Аладин",954);
$g = array("Ура!");

$x->m($p,"2-ой параметр<br />");
$x->s($g);

?>



Результат:
Цитата

Динозавр Аладин 954 2-ой параметр
Ура!


Зачем мне пришлось внутреннего пихать foreach, почему так не работало?

Если я хочу передать функции __call переменную с тремя параметрами, то есть вот так:

$x->s($g,"Санчо","3-ий параметр<br />");

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

Спустя 8 минут, 20 секунд (3.08.2011 - 21:32) jetistyum написал(а):
читай документацию, в третий раз говорю тебе

Спустя 2 минуты, 10 секунд (3.08.2011 - 21:34) romantik2011 написал(а):
Так я же прочитал, функция кол принимает первым параметром неопределённую функцию ,а вторым - параметры функций, вот и пробую, что-то не срабатывает вызов перегруженного метода.

Спустя 6 минут, 9 секунд (3.08.2011 - 21:40) ZSH написал(а):
Цитата
а вторым - параметры функций,


массив параметров

Спустя 8 минут, 26 секунд (3.08.2011 - 21:49) romantik2011 написал(а):
Если так написать всё выводит, но масив не выводит никак.

<?php
class
D{
function m($p1,$p2){
for($i=0; $i<count($p1); $i++)
echo $p1[$i].' ';
echo ' '.$p2;
}
function __call($n,$v) {
foreach($v as $f){
echo $f.' ';
}
}


}

$x = new D;
$p = array("Динозавр","Аладин",954);
$g = array("Ура!");

$x->m($p,"2-ой параметр<br />");
$x->s($g,"Санчо","3-ий параметр");

?>



Результат:
Цитата
Динозавр Аладин 954 2-ой параметр
Array Санчо 3-ий параметр

Спустя 4 минуты, 53 секунды (3.08.2011 - 21:54) ZSH написал(а):
function __call($n,$v)
{
echo '<pre>';
var_dump($v);
echo '</pre>';
}


и посмотри структуру передаваемого массива с параметрами

Спустя 12 минут, 19 секунд (3.08.2011 - 22:06) romantik2011 написал(а):
А почему только вот так сработало? Почему без внутреннего цикла не запахало и без всяких проверок и приведений типов?
Кто-нибудь подскажет как реализовать не так громоздко цикл форич?

<?php
class
D{
function m($p1,$p2){
for($i=0; $i<count($p1); $i++)
echo $p1[$i].' ';
echo ' '.$p2;
}

function __call($n,$v) {
foreach($v as $f){
if ((string)$f == "Array")
foreach($f as $v)
{
echo $v;
}
else echo $f.' ';
}
}

}

$x = new D;
$p = array("Динозавр","Аладин",954);
$g = array("Ура!");

$x->m($p,"2-ой параметр<br />");
$x->s($g,"Санчо","3-ий параметр");

?>

Спустя 10 минут, 51 секунда (3.08.2011 - 22:17) ZSH написал(а):
потому что первый передаваемый параметр является массивом и его надо разобрать для вывода.

if ((string)$f == "Array")
замени на:
if (is_array($f))

Спустя 33 минуты, 25 секунд (3.08.2011 - 22:50) romantik2011 написал(а):
Хорошо, смотрите, дописал ещё одну функцию и работает без внутреннего форич, почему? Зачем там разбивать надо было в функции кол форич? В функции Аладин я тоже сделал первый параметр массивом и оно за одну итерацию прошло без всяких проверок. Почему так?


<?php
class
D{
function m($p1,$p2){
for($i=0; $i<count($p1); $i++)
echo $p1[$i].' ';
echo ' '.$p2;
}

function __call($n,$v) {
foreach($v as $f){
if ((string)$f == "Array")
foreach($f as $v)
{
echo $v;
}
else echo $f.' ';
}
}


function aladin($bos,$fantik){
foreach($bos as $aromat){
echo $aromat.' ';
}
echo $fantik;
}
}


$x = new D;

$p = array("Динозавр","Аладин",954);
$g = array("Ура!");
$robot = array("Гуливер","Фантамас",true);

$x->m($p,"2-ой параметр<br />");
$x->s($g,"Санчо","3-ий параметр");
echo '<br />';
$x->aladin($robot,"+Гусь");

?>

Спустя 13 минут, 53 секунды (3.08.2011 - 23:04) ZSH написал(а):
потому что в aladin передается 1-й параметр массив
$robot в aladin:
array(
0 => "Гуливер",
1 => "Фантамас",
2 => true
)


а в __call принимается 2-й параметр в любом случае массив:
$v в __call :
array(
0 => array(
0 => "Ура!"
),
1 => "Санчо",
2 => "3-ий параметр"
)


и если $g = array("Ура!","Ауу!");
то $v в __call:
array(
0 => array(
0 => "Ура!",
1 => "Ауу!"
),
1 => "Санчо",
2 => "3-ий параметр"
)

Спустя 41 минута, 35 секунд (3.08.2011 - 23:46) romantik2011 написал(а):
А как сделать похожу свою такую как __call?

Спустя 7 часов, 59 минут, 33 секунды (4.08.2011 - 07:45) linker написал(а):
romantik2011
Ты видимо начитался про С++. Перегруженные методы, нету такого понятия в PHP. Функциям PHP вообще пофигу сколько параметров ты передашь, главное чтобы не меньше чем указано в описании. Список параметров можно получить func_get_args(), вызвать метод со списком параметров из __call():
call_user_func_array(array($this, 'm'), func_get_args());
Дальше думай.

Спустя 1 месяц, 10 дней, 12 часов, 2 минуты, 20 секунд (14.09.2011 - 19:48) efanchik написал(а):
Кто-нибудь подскажет как реализовать не так громоздко цикл форич?
Вот так попробуй:

class D{
function m($p1,$p2){
$cnt = count($p1); //счетчик за пределы цикла для оптимизации
for($i=0; $i<$cnt; $i++)
echo $p1[$i].'<br />';
echo $p2.'<br />';
}

function __call($method, $args) {
if(method_exists($this, $method)){
return call_user_func_array(array($this, $method), $args);
}
}
}

$x = new D;
$p = array("Dinozavr","Aladdin", 954);
$g = array("Ura!");

$x->m($p,"2-oi parametr");
$x->m($g,"Sancho","3-i parametr");


Функция call_user_func_array передает отдельные аргументы.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.