Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Call to undefined function, хотя include был


Автор: AzuManga 21.8.2007, 01:18
Здравствуйте, форумчане!

У меня, может и детская проблема от недосыпа, но она есть 8)))

Я делаю скелет сайта на PHP, который выглядит вот так.

Основной файл index.php, в который .htaccess отправляет все запросы:

Код

<?php 
    require_once('classes/BusManager.php');
    intialize();
    
    if(!isset($_GET['first'])){
        include('templates/main.php');
    }
    else if($_GET['first'] == 'cities'){
        echo 'города';
    }
    else if($_GET['first'] == 'companies'){
        echo 'компании';
    }
    else if($_GET['first'] == 'ways'){
        echo 'маршруты';
    }
?>


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

В файле BusManager.php содержатся все вспомогательные функции:
Код

<?php
    
    function intialize(){
            // конструктор
        include('connect.inc');
        $GLOBALS['site'] = $homedir;
        $connection = mysql_connect ($host, $user, $password) or die ('I cannot connect to the database.');
        mysql_selectdb($database);
    }
    
    function gethomedir(){
        return $GLOBALS['site'];
    }
    
    function getheader(){
        include($GLOBALS['site'].'templates/header.php');
    }
    
    function getfooter(){
        include($GLOBALS['site'].'templates/footer.php');
    }
?>


Шаблон морды предельно прост:
Код

<?php 
    getheader();
    getfooter();
?>


Шаблон header.php тоже несложный:
Код

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="ru">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />
    <title>Русавтобус.</title>
    <meta name="description" content="расписание автобусов, автобусы, маршруты автобусов" />
    <link rel="stylesheet" type="text/css" href="<?php gethomedir().'screen.css';?>" media="screen" />
</head>


Суть проблемы в том, что из шаблона header.php не вызывается функция gethomedir(), хотя файл BusManager.php с этой функцией был подключен в самом начале работы. Вместо выполнения этой функции выводится ошибка "Fatal error:  Call to undefined function:  gethomedir() in z:\home\avtobus\www\templates\header.php on line 7"

Подскажите, плиз, куда копать 8)

Автор: Severyanin 21.8.2007, 05:46
С корее всего, потому, что она вызывается не из тела документа, а из заголовка. Браузер просто не видит этого линка. Попробуйте вытащить ее в body.

Автор: AzuManga 21.8.2007, 06:24
Severyanin, спасибо за ответ, но дело не в этом. Ради надежности даже протестировал и попробовал поместить в body, но толку не было smile 

Я думаю, что тут где-то с последовательностью подключения файлов беда или ...

Автор: Severyanin 21.8.2007, 08:05
А как определяется $homedir? Я думаю, будет проще использовать getcwd() для определеия местоположения скрипта.

Автор: -=Ustas=- 21.8.2007, 09:10
Проверь на правильность и корректность символов в названии описания функции и ее вызова.

Автор: AzuManga 21.8.2007, 09:16
Severyanin, суть в том, что мне еще много функций потом дергать из этого файла.

-=Ustas=-, на уровне корректности символов все ок.

Я вот странное заметил. Если подключить в header.php в самом начале 

Код

<?php require_once('../classes/BusManager.php');?>


То функция уже видна, но глобальная переменная site - не видна и нужно заново дергать функцию initialize() .... Почему же? Если я уже в самом начале подключил этот файл и вызвал эту функцию???

Автор: Severyanin 21.8.2007, 10:06
А почему нельзя возвращать function gethomedir() просто getcwd()? А подключаться файлы будут также. 
include(getcwd().'templates/header.php'); Или слишком медленно?

Автор: -=Ustas=- 21.8.2007, 11:41
AzuManga, поставь какой нить константный флаг в файле функций и в хедере его выведи. Мне просто интересно, что у тебя будет в результате.

Автор: sTa1kEr 21.8.2007, 11:46
AzuManga, можно узнать какая версия PHP и Apache?

Автор: AzuManga 22.8.2007, 09:30
Проблему решил тем, что подключил файл с фукнциями в файле header.php , спасибо всем, кто отвечал за участие 8)

sTa1kEr, на локалке PHP 4.4.4, Apache 1.3.33 .

-=Ustas=-, если честно, я не знаю как поставить константный флаг в файле функций... Если расскажешь — буду благодарен и потестирую *)

Автор: GiV 22.8.2007, 10:19
Флаг ставится например так:
Код
define('FLAG_NAME', 1);



Проверка флага в других скриптах, подключающих скрипт с флагом, будет такая

Код
if (defined('FLAG_NAME')) {
    echo 'Flag is set';
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)