необходимо загрузить два модуля, содержащие одинаковые названия функций

fantik

Новичок
необходимо загрузить два модуля, содержащие одинаковые названия функций

В общем суть вопроса такова.

Есть несколько модулей, в каждом из которых есть функция "имямодуля_init", в которой содержатся некоторые данные.

В обычной работе модули использоваться вместе не могут, проблема возникает только в следующем случае. В специальном разделе админки есть администрирование прав пользователей на использование определенных модулей, и в связи с этим нужно использовать функцию "имямодуля_init" из каждого модуля.

Использую include и когда встречаются одинаковые имена функций в разных модулях - появляется ошибка
PHP:
Fatal error: Cannot redeclare show() (previously declared in z:/home/newadmin/www/admin/modules/admin.php:163)
Эти функции мне не нужны, нужны только "имямодуля_init", имена которых не повторяются в модулях.

Вопрос. Каким-то образом можно удалить функцию в ран-тайме?

Или, еще вариант, есть ли какая-то возможность при вызове include не использовать все функции или хотя бы не выдавать ошибку при совпадении имён?
 

fantik

Новичок
А каким-то образом можно удалить функцию в ран-тайме?

Очень уж не хочется все эти init-ы в отдельный файл совать :(
 

Фанат

oncle terrible
Команда форума
никаким

есть ещё один способ.
я тебе подскажу, а то самому очень сложно догадаться.
дать функциям РАЗНЫЕ ИМЕНА!
 

fantik

Новичок
Уважаемый Фанат, не иронизируйте :)

Ибо я спрашиваю не потому, что ламер, а лишь потому, что Вы знаете больше меня. А если в системе будет не два, а пятьдесят, двести модулей? Искать где и с чем пересекаются имена, править имена, вызовы функций? Ради чего?

Решение :
- сделал файл init.php, куда пихнул все функции "имямодуля_init".
 

Alexandre

PHPПенсионер
Фанат, вроде namespace реализован реализован (или это в 6й версии?) патч был однозначно.
 

svetasmirnova

маленький монстрик
Alexandre
Ой! Реализован-то он был... Я за развитием 6-ой версии последнее время не следила, но вроде ещё не факт, что он окончательно утверждён даже для шестой.
 

maxru

МИФИст
У меня была проблема с исполнением функций макросов, которые будут писаться не мной, а неизвестно кем.

В общем-то необходимо действительно дать им разные имена, но с другой стороны, не будут же пользователи, пишущие макросы ковыряться в моём коде, ища, есть ли там такое название.

Решение:

1) Каждому файлу(или обьекту) надо дать свой идентификатор.
Трёх-четырёх символов хватит.
2) Функция myFu() будет называться так:
id1_myFu() в 1м файле
id2_myFu() во 2м файле.

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

В случае перегрузки, создаём массив $MACROS

В файлах с функциями прописываем:
$MACROS['myFu']="id1_myFu"; #1
$MACROS['myFu']="id2_myFU"; #2

При подключении первого, вызов $MACROS["myFu"]()
Вызовет 1ю функцию
При подключении второго файла вызов $MACROS["myFu"]()
будет выдавть значения второй функции.

Если нужна именно перегрузка, от это остаётся сложным вопросом (количество и тип входных данных у разных функций)

Если нужна поддержка обеих, то массив выглядит например так:

$MACROS[уникальный_идентификатор_файла]['myFu']="id1_myFu";

или как-то похоже.

З.Ы. Работает достаточно быстро.
 

Alexandre

PHPПенсионер
В общем-то необходимо действительно дать им разные имена, но с другой стороны, не будут же пользователи, пишущие макросы ковыряться в моём коде, ища, есть ли там такое название
используй имена по принципу PackageModuleName. Введи фиктивное имя пакета, например MyPacket и используй его как префикс ко всем своим классам. Это нормальная практика.
Пример:
MyPacketTemplater
MyPacketController
MyPacketViever
MyPacketDb

Это тебе также пригодится для документирования. www.phpdoc.org :cool:
см. опцию пакеты.
 

Royal Flash

-=MaestrO=-
fantik
Помоему, если я правильно понял ваш вопрос, все очень просто: http://www.php.net/function_exists
Перед объявлением любой функции пишем:
PHP:
if (!function_exists(func_name)){
  function func_name() {
     echo "Hello Word!";}}
 

fantik

Новичок
Royal Flash
Вариант... Но опять же, как и всё в моем случае достаточно кривой :)

clops
Озадачили вы меня, уважаемый... Читать про ООП я не буду, начитался в студенческое время, а так как было оно не так давно, воспоминания свежие... И внял совету, теперь всё по-человечески делаю. До этого лень было всё заново переписывать, но с чего-то нужно начинать ! Стоит сказать спасибо !

Параллельно поставил PHP 5.1.2

Возникла по ходу дела следующая проблема. Банальное
PHP:
...
$lines= array();
...
$lines[] = $line;
Выдает ошибку Parse error: syntax error, unexpected ']', expecting T_STRING or T_VARIABLE or T_NUM_STRING in D:\soft\xampp\htdocs\admin\common.php on line 41
При замене на
PHP:
...
$lines= array();
...
array_push($lines, $line)
Всё работает замечательно... В чем же дело?
 

Paxan

Новичёк
fantik
PHP:
$lines= array(); 
$line = 5; 
$lines[] = $line;
print_r($lines); 
/*
Array
(
    [0] => 5
)
*/
 

fantik

Новичок
Странно.

Проверил в отдельном файле, всё работает.

Используемая конструкция имеет вид (всё лишнее вырезано):
PHP:
<?

class common{
	
  private	$dbname ;
  private	$dbhost ;
  private	$dbuser ;
  private	$dbpass ;
	private $root;
	public 	$title ;
	
	function sql_connect () {
	   $link = mysql_connect($this->dbhost, $this->dbuser, $this->dbpass) or die("Could not connect");
	   mysql_select_db($this->dbname) or die("Could not select database");
	   return $link ;
	}
	function sql_get ($query) {
	   $result = mysql_query($query) or die(data ("red", "Query <b>".htmlspecialchars($query)."</b> failed"));
	   $lines = array ();
	   while ( $line = mysql_fetch_array($result, MYSQL_ASSOC)) {
	           $lines[] = $line;
	   }
	   mysql_free_result($result);
	   return $lines ;
	}
	function sql_send ($query) {
	        $result = mysql_query($query) or die(data ("red", "Query <b>".htmlspecialchars($query)."</b> failed"));
	        return $result ;
	        mysql_free_result($result);
	}
	function setvars ($vars){
	  $this->dbname = $vars->getvar("dbname");
	  $this->dbhost = $vars->getvar("dbhost");
	  $this->dbuser = $vars->getvar("dbuser");
	  $this->dbpass = $vars->getvar("dbpass");
		$this->title = $vars->getvar("title");
	}


	function __construct(){
		ini_set ('display_errors', true); 
		ini_set('error_reporting', E_ALL);
		include "vars.php";
		$this->setvars(new vars);
	}


}
?>
в функции sql_get на строке $lines[] = $line; выдаёт ошибку Parse error: syntax error, unexpected ']', expecting T_STRING or T_VARIABLE or T_NUM_STRING in common.php on line 41

PHP 5.1.2
Apache 2.2.0
 

fantik

Новичок
Разобрался.

В функции до этого, которую удалил в примере, была конструкция вида
PHP:
...
  return <<<END;
  <html>
  ...
  </html>
  END;
...
Мой недосмотр, перед
PHP:
END;
таб поставил, а ошибку выдавало, разумеется, совсем в другом месте :(
 
Сверху