<?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. параметры вызова массивом. (Ты конечно же прочитал про это, прежде чем пытаться написать) ну а дальше думай почему так получилось
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))
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:
а в __call принимается 2-й параметр в любом случае массив:
$v в __call :
и если $g = array("Ура!","Ауу!");
то $v в __call:
$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():
Ты видимо начитался про С++. Перегруженные методы, нету такого понятия в 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 написал(а):
Кто-нибудь подскажет как реализовать не так громоздко цикл форич?
Вот так попробуй:
Функция call_user_func_array передает отдельные аргументы.
Вот так попробуй:
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 передает отдельные аргументы.