Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Ссылки на функции, есть ли такое в PHP
 
 автор: rom   (28.07.2005 в 18:24)   письмо автору
 
 

Коллеги, приветствую!

Существует простая задача. Есть класс, я в него должен запихнуть ссылки на функции, а потом по мере необходимости их вызывать. При этом, хочется запихнуть туда именно ССЫЛКИ НА ФУНКЦИИ, а не названия функций, потому как функции могут быть как одинокостоящие, так и быть функциями классов. Но вот я так и не понял, предусмотрены ли ссылки на функции в PHP. Если да, то как ими пользоваться. Как их делать и как потом вызывать функцию по ссылке.

Еще раз хотелось бы подчеркнуть, что как пользоваться вызовом функций по их названию я и так умею :) интересуют именно ссылки (такие как в Perl, C и т.д.).

Заранее спасибо за ответ!

   
 
 автор: cheops   (28.07.2005 в 18:55)   письмо автору
 
   для: rom   (28.07.2005 в 18:24)
 

Чего-то не припомню, чтобы на PHP можно было использовать ссылки и указатели на функции как в С. А есть ли в этом надобность, тем более при использовании классов - ведь полиморфизм как раз введён для того, чтобы исключить бездумное манипулирование указателями на функции... Какая исходная задача?

   
 
 автор: rom   (28.07.2005 в 21:28)   письмо автору
 
   для: cheops   (28.07.2005 в 18:55)
 

Необходимость есть. Нужно нечно такое:

function a()
{
...
}

class b
{
function bf()
{
...
}
}

$m = array();
$bc = new b();

array_push($m, ссылка_на_функцию_a);
array_push($m, ссылка_на_функцию_bf_класса_b_экземпляра_$bc);

foreach ($m as $f)
{
вызов_функции_ссылка_на_которую_в_$f;
}

естественно занесение в массив и вызов завернуто в класс - тут я для наглядности показал.

   
 
 автор: cheops   (29.07.2005 в 00:06)   письмо автору
 
   для: rom   (28.07.2005 в 21:28)
 

Вам нужна функция array_walk() - она позволяет применить к каждому элементу массива пользовательскую функцию.

   
 
 автор: rom   (29.07.2005 в 01:50)   письмо автору
 
   для: cheops   (29.07.2005 в 00:06)
 

И как же она мне поможет? Можно пример? На сколько я понял из описания, эта фунция позволяет применить ОДНУ любую функцию для всех элементов массива (например, для строк). А мне нужно "дернуть" элементы массива, чтобы каждый выполнил свою работу.

   
 
 автор: cheops   (29.07.2005 в 11:37)   письмо автору
 
   для: rom   (29.07.2005 в 01:50)
 

А что находится в массиве $m и в чём заключается работа элемента?

   
 
 автор: rom   (29.07.2005 в 12:12)   письмо автору
 
   для: cheops   (29.07.2005 в 11:37)
 

в массиве $m должны находиться ссылки на функции. Соответственно, класс вывода не парится, что это за функция, кму принадлежит, как называется, а просто дергает функцию и все, а функция уже сама делает что надо.
Приведу пример для аналогии. В виндовом интерфейсе, к примеру, функция вывода на экран дергает по очереди метод Show у элементов (окна, кнопки, воля ввода и т.д.), а они уже, в свою очередь, сами себя отображают. Если нужно, эти же функции Show дергают Show у входящих в них элементов и т.д. пока не будут выведены все элементы. А мне хочется, чтобы дергался не только метод Show, а любой метод класса или отдельно стоящая функция. В Перле с этим проблем нет, и в С нет. Но, похоже, в ПХП такого просто не предусмотрено... Как это обойти я пока тоже не придумал. Либо привязываться к названиям функций (чего делать очень не хочется), либо не знаю....

   
 
 автор: cheops   (29.07.2005 в 13:02)   письмо автору
 
   для: rom   (29.07.2005 в 12:12)
 

Windows на С написан (может сейчас на С++ конечно переписали), поэтому они и пребегают к указателям и ссылкам на функции - т.е. это красивый пример объектно-ориентированного программирования на языке без поддержки оного. А вообще это полиморфизм, когда каждый объет-потомок имеет метод с одинаковым названием, но разным содержанием - никаких ссылок не нужно, просто требуется обращаться к методу show, а элемент сам себя отрисует. Просто в классе-предке метод объявляется виртуальным и потомки хош не хош его должны реализовывать, что гарантирует, что каждый конечный объект будет иметь метод show. Почему нельзя действительно прибегнуть к foreach?
<?php
foreach ($m as $f)
{
  
$f->show();
}
?>

   
 
 автор: rom   (02.08.2005 в 14:44)   письмо автору
 
   для: cheops   (29.07.2005 в 13:02)
 

Этот случай не рассматривается - он понятен. А почему не хочется иметь show, так это потому, что в классе может быть несколько шоу. и не хотелось бы завязывать себя на одном названии. может быть я захочу дернуть из одного и того же класса несколько разных шоу для отображения разных вещей.
Допустим, есть класс, отвечающий за товар. Он умеет добавить товар в базу, загрузить информацию в себя из базы. А также имеет несколько функций отображения. Одна отображает цену, другая - всю инфу о товаре, еще одна - только название товара. И что, мне плодить столько же классов, сколько у меня будет разных шоу??? нафига? если единица оперирования одна - товар. т.е. объект должен быть один. Или я не прав и надругался своими рассуждениями над полиморфизмом?
Короче, это не решение проблемы, а уход от нее :)) Раз никто тут не знает по поводу ссылок на функции, то, значит, я делаю вывод, что их просто нет в языке. Соответственно, буду искать обходные моневры :) В любом случае - большое спасибо.
P.S. А по поводу C++ я бы поспорил :) он сочетает в себе гибкость С и стройность объектно-ориентированной модели. неплохое сочетание. хотя все дело вкуса.

   
 
 автор: cheops   (02.08.2005 в 19:06)   письмо автору
 
   для: rom   (02.08.2005 в 14:44)
 

>P.S. А по поводу C++ я бы поспорил :) он сочетает в себе
>гибкость С и стройность объектно-ориентированной модели.
>неплохое сочетание. хотя все дело вкуса.
Против этого и не спорю :))) сам C++ люблю и считаю С причёсанным ассемблером :)))

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования