X   Сообщение сайта
(Сообщение закроется через 3 секунды)



 

Здравствуйте, гость (

| Вход | Регистрация )

2 страниц V   1 2 >
Открыть тему
Тема закрыта
> Эмуляция перегрузки в PHP, метод __call()
romantik2011
romantik2011
Topic Starter сообщение 30.7.2011, 2:17; Ответить: romantik2011
Сообщение #1


Решил сделать симулировать перегрузку в PHP, написал вот такой код.
[php]
class A{
function t($m){
echo " ".$m;
}

function __call($x1,$x2){
function t($s1,$s2){
$s1 = $x1;
$s2 = $x2;
echo $s1.' '.$s2;
}
function t($s1,$s2,$s3){
$s1 = $x1;
$s2 = $x2;
echo $s1.' '.$s2.' '.$s3;
}

}

}

$obj = new A;
$obj->t("Каприз");
$obj->t(5,7);
$obj->t("Вася",500,"Мачо");

[/php]

Результат:
Каприз 5 Вася


Почему не выводится так?
Каприз
5 7
Вася 500 Мачо
0
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Mulder_hb
Mulder_hb
сообщение 30.7.2011, 11:57; Ответить: Mulder_hb
Сообщение #2


Потому что метод __call у вас даже не вызывается. Во всех случаях вызывается самый первый метод t($m), которому всегда передается лишь первый аргумент, остальные, если есть, отбрасываются.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
romantik2011
romantik2011
Topic Starter сообщение 30.7.2011, 16:48; Ответить: romantik2011
Сообщение #3


А как правильно сделать чтоб было похоже на перегрузку?
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Mulder_hb
Mulder_hb
сообщение 30.7.2011, 17:56; Ответить: Mulder_hb
Сообщение #4


Есть много способов. Самый простой:
[PHP]<?php

class A {
public function t() {
$argc = func_num_args();
$argv = func_get_args();
switch ($argc) {
case 1:
call_user_func_array(array($this, 't1'), $argv);
break;
case 2:
call_user_func_array(array($this, 't2'), $argv);
break;
case 3:
call_user_func_array(array($this, 't3'), $argv);
break;
default:
$this->t0();
}
}

private function t1($arg) {
echo '1: ' . $arg . PHP_EOL;
}

private function t2($arg1, $arg2) {
echo '2: ' . $arg1 . ' ' . $arg2 . PHP_EOL;
}

private function t3($arg1, $arg2, $arg3) {
echo '3: ' . $arg1 . ' ' . $arg2 . ' ' . $arg3 . PHP_EOL;
}

private function t0() {
echo 'empty' . PHP_EOL;
}
}

$a = new A;
$a->t('Вася');
$a->t('Вася', 'Пупкин');
$a->t();[/PHP]
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
alexdrob
alexdrob
сообщение 30.7.2011, 22:35; Ответить: alexdrob
Сообщение #5


(romantik2011 @ 30.7.2011, 19:48) *
А как правильно сделать чтоб было похоже на перегрузку?

вам же уже писали
http://www.html.by/threads/20237-Peregruzk...ll=1#post120132
http://www.html.by/threads/20237-Peregruzk...ll=1#post120211
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
romantik2011
romantik2011
Topic Starter сообщение 3.8.2011, 20:28; Ответить: romantik2011
Сообщение #6


Попробовал написать такой код, не выводит все три параметра почему-то. Я имею ввиду, второго перегруженного метода с именем m().
[PHP]
<?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 />");

?>

[/PHP]
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
alexdrob
alexdrob
сообщение 3.8.2011, 20:33; Ответить: alexdrob
Сообщение #7


вы читаете что вам пишут?
вам ответили
(Mulder_hb @ 30.7.2011, 14:57) *
Потому что метод __call у вас даже не вызывается. Во всех случаях вызывается самый первый метод t


функция __call вызывается когда? когда не найдена функция по имени, а у вас есть функция m так почему тогда __call должна вызываться если функция m есть?
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
romantik2011
romantik2011
Topic Starter сообщение 3.8.2011, 20:41; Ответить: romantik2011
Сообщение #8


Ясно, но почему-то цикл фор-ич не подставил значения.
Я изменил вот эту строку:
[PHP]$x->m($g,"Санчо","3-ий параметр");[/PHP]
на эту
[PHP]$x->s($g,"Санчо","3-ий параметр");[/PHP]

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

Почему форич значения не подстаивл, а вывалил всё Array вместо значений?
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
alexdrob
alexdrob
сообщение 3.8.2011, 20:56; Ответить: alexdrob
Сообщение #9


У вас ехо выводит переменную v пробел потом значение массива.
Все правильно вам вывелось
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
romantik2011
romantik2011
Topic Starter сообщение 3.8.2011, 22:01; Ответить: romantik2011
Сообщение #10


Значение массива не выводит, выводит вместо значения просто слово Array
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
2 страниц V   1 2 >
Открыть тему
Тема закрыта
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


Свернуть

> Похожие темы

  Тема Ответов Автор Просмотров Последний ответ
Открытая тема (нет новых ответов) СОЗДАНИЕ : / САЙтЫ / ЛЕНДЫ / БОТЫ ТГ / ВАЙТЫ / КРЕО / СОФТЫ / ДИЗАЙН [PHP, JS, HTML/CSS] и другое
5 CULA 3401 19.12.2023, 18:55
автор: CULA
Открытая тема (нет новых ответов) Услуги по созданию и доработке скриптов PHP, MySQL, JavaScript, jQuery
Разработка сайтов и сервисов под-ключ
0 alexey 1242 24.11.2023, 14:46
автор: alexey
Горячая тема (нет новых ответов) Тема имеет прикрепленные файлыВеб-разработка (HTML5, CSS3, JavaScript, jQuery, Ajax, PHP)
56 qpPeW 44908 19.7.2023, 10:03
автор: qpPeW
Открытая тема (нет новых ответов) Есть спецы по php/laravel?
3 Mixatraider 1889 26.5.2023, 20:48
автор: Mixatraider
Открытая тема (нет новых ответов) Опытный PHP\Python разработчик в поиске интересных задач
6 daikzlex 3402 25.5.2023, 13:55
автор: daikzlex


 



RSS Текстовая версия Сейчас: 20.4.2024, 2:26
Дизайн